加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2022-10-21 12:47:15 所属栏目:Linux 来源:
导读:  创建这东西有什么用呢?有!玩过树莓派、香橙派等各种派的同志们都知道,从网上下载到一个系统镜像文件,烧写到TF卡之后linux分区工具,TF卡就变成俩分区的了,我不知道人家是不是像我这样做的镜像,但是,用这个
  创建这东西有什么用呢?有!玩过树莓派、香橙派等各种派的同志们都知道,从网上下载到一个系统镜像文件,烧写到TF卡之后linux分区工具,TF卡就变成俩分区的了,我不知道人家是不是像我这样做的镜像,但是,用这个方法做成了Orangepi Zero的系统镜像。
 
  还有一个用途:把一些不想让别人看到的东西,塞到这个镜像文件里,不知道文件格式的人根本不知道怎么打开(好吧,这个功能确实很牵强)。
 
  制作步骤与方法(Ubuntu环境,缺命令的自己安装一下):
 
  Step1:制作一个空白文件,也就相当于买一块硬盘,文件名叫做VirtualDisk.img,总大小为32MB(自己根据需要修改大小),这个dd命令的具体用法请自行搜索。
 
  # dd if=/dev/zero of=VirtualDisk.img bs=1M count=32
  Step2:为空白文件创建分区,我这里创建两个分区,第一个分区4MB,文件系统为FAT,剩下的空间作为第二个分区,文件系统为EXT4,使用fdisk命令进行分区,fdisk的使用方法请自行搜索,这里为了简便,我就把手动操作fdisk的命令全部打到一行了:
 
  # echo 'n\np\n1\n2048\n18432\nt\nb\nn\np\n2\n18433\n\nw\n' |fdisk VirtualDisk.img > /dev/null
  上面一行命令我觉得不解释一下可能会挨揍,具体是这样的:
 
  echo后面的一堆东西,是按照操作fdisk命令的输入顺序码出来的,所有的\n都代表回车,也就是说,上面的命令相当于这样做:
 
  先执行 fdisk VirtualDisk.img,然后依次输入:n (新建分区)、回车、p(主分区)、回车、1(第一个分区)、回车、2048(从2048处开始)、回车……(自己解析吧)
 
  Step3:把镜像文件映射(暂且叫映射吧,你看完后面内容慢慢理解这步操作的意思)到系统中:
 
  # kpartx -av VirtualDisk.img
  执行这条命令之后,在系统的/dev/mapper/目录中会生成两个文件:loop0p1和loop0p2
 
  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分区用dosfslabel命令,EXT分区用e2label命令。上面的BOOT和Linux字符串是卷标,随意设置。到此,虚拟磁盘文件已经建立完成了,下面是如何挂载、使用的方法。
 
  Step6:创建挂载点并挂载分区
 
  # 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脚本,用来打包Orangepi Zero系统镜像的,需要的拿去修改一下再用(不要嘲笑我的注释,那是Chglish)。
 
  #! /bin/sh
  IMG_NAME="OrangePiZero.img"
  # Create a new disk image: 32MB
  dd if=/dev/zero of=$IMG_NAME bs=1M count=32
  # Partition the image, part1: 4MB@FAT32, part2:@EXT4
  echo 'n\np\n1\n2048\n18432\nt\nb\nn\np\n2\n18433\n\nw\n' |fdisk $IMG_NAME > /dev/null
  # Just have a look
  fdisk -l $IMG_NAME |tail -n 3
  # Mapping the image to host system
  sudo kpartx -av $IMG_NAME
  [ $? -ne 0 ] && echo "Please use right root password." && exit 1
  sleep 0.1s # Don't remove this!!!
  # Format the partion: part1@FAT32
  sudo mkfs.vfat /dev/mapper/loop0p1
  # Format the partion: part2@EXT4
  sudo mkfs.ext4 /dev/mapper/loop0p2
  sleep 0.1s # Don't remove this!!!
  # Change the label of partion: part1@BOOT
  sudo dosfslabel /dev/mapper/loop0p1 "BOOT"
 
  # Change the label of partion: part2@Linux
  sudo e2label /dev/mapper/loop0p2 "Linux"
  # Create mountpoints
  sudo mkdir -p /mnt/BOOT
  sudo mkdir -p /mnt/Linux
  # Mount partions
  sudo mount -o loop -t vfat /dev/mapper/loop0p1 /mnt/BOOT
  sudo mount -o loop -t ext4 /dev/mapper/loop0p2 /mnt/Linux
  # Copy files to image partions
  sudo cp -v zImage sun8i-h2-plus-orangepi-zero.dtb /mnt/BOOT
  sudo cp -v -r rootfs/* /mnt/Linux/
  sync
  # Unmount partions
  sudo umount -l /mnt/BOOT
  sudo umount -l /mnt/Linux
  # Delete mountpoints
  sudo rm -rf /mnt/BOOT
  sudo rm -rf /mnt/Linux
  # Install u-boot to image
  sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8
  # Unmap the image from host system
  sudo kpartx -d $IMG_NAME
  [ $? -ne 0 ] && echo "Please use right root password." && exit 1
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!