单文件多分区 Linux创建虚拟磁盘文件

创建这东西有什么用呢?有!玩过树莓派、香橙派等各种派的同志们都知道,从网上下载到一个系统镜像文件,烧写到TF卡之后,TF卡就变成俩分区的了,我不知道人家是不是像我这样做的镜像,但是,用这个方法做成了 Zero的系统镜像 。
还有一个用途:把一些不想让别人看到的东西,塞到这个镜像文件里,不知道文件格式的人根本不知道怎么打开(好吧,这个功能确实很牵强) 。
制作步骤与方法(环境 , 缺命令的自己安装一下):
Step1:制作一个空白文件 , 也就相当于买一块硬盘 , 文件名叫做.img,总大小为32MB(自己根据需要修改大?。? ,这个dd命令的具体用法请自行搜索 。
# dd if=/dev/zero of=VirtualDisk.img bs=1M count=32
Step2:为空白文件创建分区,我这里创建两个分区 , 第一个分区4MB怎么修改移动硬盘的文件系统,文件系统为FAT,剩下的空间作为第二个分区,文件系统为EXT4,使用fdisk命令进行分区,fdisk的使用方法请自行搜索,这里为了简便 , 我就把手动操作fdisk的命令全部打到一行了:
# echo 'nnpn1n2048n18432ntnbnnnpn2n18433nnwn' |fdisk VirtualDisk.img > /dev/null
上面一行命令我觉得不解释一下可能会挨揍,具体是这样的:
echo后面的一堆东西,是按照操作fdisk命令的输入顺序码出来的,所有的n都代表回车,也就是说,上面的命令相当于这样做:
先执行 fdisk .img,然后依次输入:n (新建分区)、回车、p(主分区)、回车、1(第一个分区)、回车、2048(从2048处开始)、回车……(自己解析吧)
Step3:把镜像文件映射(暂且叫映射吧,你看完后面内容慢慢理解这步操作的意思)到系统中:
# kpartx -av VirtualDisk.img
执行这条命令之后 , 在系统的/dev//目录中会生成两个文件:和

单文件多分区 Linux创建虚拟磁盘文件

文章插图
单文件多分区 Linux创建虚拟磁盘文件

文章插图
Step4:格式化这两个分区(一个FAT、一个EXT4)
# mkfs.vfat /dev/mapper/loop0p1# mkfs.ext4 /dev/mapper/loop0p2
Step5:设置卷标 , 这一步可以省略 , 不设置的话,刷完镜像的磁盘插到电脑上会显示“可移动磁盘”或者其他系统默认的卷标
# dosfslabel /dev/mapper/loop0p1 "BOOT"# e2label /dev/mapper/loop0p2 "Linux"
FAT分区用命令,EXT分区用命令 。上面的BOOT和Linux字符串是卷标,随意设置 。到此,虚拟磁盘文件已经建立完成了,下面是如何挂载、使用的方法 。
Step6:创建挂载点并挂载分区
【单文件多分区 Linux创建虚拟磁盘文件】# mkdir -p /mnt/BOOT# mkdir -p /mnt/Linux# mount -o loop -t vfat /dev/mapper/loop0p1 /mnt/BOOT# mount -o loop -t ext4 /dev/mapper/loop0p2 /mnt/Linux
挂载成功后,就可以在/mnt/BOOT和/mnt/Linux两个文件夹中搞一些事情了
Step7:卸载分区(加-l是无条件卸载 , 防止卸不掉怎么修改移动硬盘的文件系统,是小写的L , 不是数字1)
# umount -l /mnt/BOOT# umount -l /mnt/Linux
Step8:取消虚拟磁盘文件在系统中的映射
# kpartx -d VirtualDisk.img
好了,搞定了,下面是我做的一个shell脚本 , 用来打包 Zero系统镜像的,需要的拿去修改一下再用(不要嘲笑我的注释 , 那是) 。
#! /bin/shIMG_NAME="OrangePiZero.img"# Create a new disk image: 32MBdd if=/dev/zero of=$IMG_NAME bs=1M count=32# Partition the image, part1: 4MB@FAT32, part2:@EXT4echo 'nnpn1n2048n18432ntnbnnnpn2n18433nnwn' |fdisk $IMG_NAME > /dev/null# Just have a lookfdisk -l $IMG_NAME |tail -n 3# Mapping the image to host systemsudo kpartx -av $IMG_NAME[ $? -ne 0 ] && echo "Please use right root password." && exit 1sleep 0.1s # Don't remove this!!!# Format the partion: part1@FAT32sudo mkfs.vfat /dev/mapper/loop0p1# Format the partion: part2@EXT4sudo mkfs.ext4 /dev/mapper/loop0p2sleep 0.1s # Don't remove this!!!# Change the label of partion: part1@BOOTsudo dosfslabel /dev/mapper/loop0p1 "BOOT"# Change the label of partion: part2@Linuxsudo e2label /dev/mapper/loop0p2 "Linux"# Create mountpointssudo mkdir -p /mnt/BOOTsudo mkdir -p /mnt/Linux# Mount partionssudo mount -o loop -t vfat /dev/mapper/loop0p1 /mnt/BOOTsudo mount -o loop -t ext4 /dev/mapper/loop0p2 /mnt/Linux# Copy files to image partionssudo cp -v zImage sun8i-h2-plus-orangepi-zero.dtb /mnt/BOOTsudo cp -v -r rootfs/* /mnt/Linux/sync# Unmount partionssudo umount -l /mnt/BOOTsudo umount -l /mnt/Linux# Delete mountpointssudo rm -rf /mnt/BOOTsudo rm -rf /mnt/Linux# Install u-boot to imagesudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8# Unmap the image from host systemsudo kpartx -d $IMG_NAME[ $? -ne 0 ] && echo "Please use right root password." && exit 1
本文到此结束,希望对大家有所帮助 。