raw 格式镜像的 分区 、格式化和挂载操作

本文详细介绍了如何使用losetup命令将磁盘镜像挂载到Linux系统中,包括创建镜像、分区、挂载及卸载的过程,并探讨了从raw镜像转换为qcow2格式时可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在 挂载镜像的时候,需要用到 kernel 中的 loop device 和 镜像中的分区 分别对应起来,就可以随心所欲的玩耍啦。我们需要用到一个命令 losetup。

先创建一个镜像来玩玩

dd if=/dev/zero of=test.img bs=1M count=100

分个区, 

# fdisk test.img
Command (m for help): p
Disk test.img: 100 MiB, 104857600 bytes, 204800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xfd339fe7

Device     Boot  Start    End Sectors Size Id Type
test.img1         2048 104447  102400  50M 83 Linux
test.img2       104448 204799  100352  49M 83 Linux

要注意两个分区的偏移地址,后面会用到,这里的单位是 sector

先看看有没有空闲的loopdevice ,这里只会显示一个,用到 loop0 之后,再查看会显示 loop1

# losetup -f 
/dev/loop0

把它绑定到一个分区

losetup -o $((2048*512)) /dev/loop0 demo_armhf_rootfs.img
losetup -o $((104448 *512)) /dev/loop1 demo_armhf_rootfs.img

然后就可以愉快的玩耍啦

mkfs.ext4 /dev/loop0
mkfs.ext4 /dev/loop1


mount /dev/loop0  tmp0
mount /dev/loop1  tmp1


umount tmp0 tmp1



 

别忘了最后 要释放 loop device哦

losetup -d /dev/loop0

 

 

---------------

因为 qcow2 的镜像分区要用到 nbd , 比较麻烦,是不是可以先使用 raw 镜像来分区,然后再转化为 qcow2呢?

说做就做,成功之后,使用qemu-system-arm 来启动的时候总是报 下面这样的错误,但是单独 通过 loop 的方式挂载查看设备都是没有问题的,用fsck来修复也是不行,留个疑虑吧

 bad geometry: block count 4878390 exceeds size of device (2883789 blocks)
<think>我们讨论的是如何修改挂载镜像的只读属性,使其可写。 根据引用内容,我们注意到在Linux中挂载ISO镜像时,系统默认以只读方式挂载(如引用[1]所示)。这是因为ISO-9660文件系统本身是只读的。但我们可以通过其他方式实现可写挂载,例如使用环回设备(loop device叠加文件系统(overlayfs),或者将镜像内容复制到可写目录进行修改后重新生成镜像。 用户需求:将挂载镜像从只读变为可写。 解决方案: 1. 使用环回设备(loop device叠加文件系统(overlayfs)实现可写挂载(无需修改原镜像,临时性)。 2. 将镜像内容复制到可写目录,修改后重新生成镜像(永久性修改)。 下面分别介绍两种方法: ### 方法1:使用overlayfs实现可写挂载(临时性) 这种方法允许你在不修改原始镜像的情况下,在挂载点进行读写操作。实际修改会保存在一个临时目录(upperdir)中,而原始镜像保持不变。 步骤: 1. 创建几个目录用于overlayfs: ```bash mkdir /mnt/lower /mnt/upper /mnt/work /mnt/merged ``` 2. 将原始镜像以只读方式挂载到`/mnt/lower`(这是必须的,因为ISO是只读的): ```bash mount -o ro /path/to/image.iso /mnt/lower ``` 3. 使用overlayfs挂载到`/mnt/merged`,其中`/mnt/upper`用于存储修改,`/mnt/work`是工作目录(必须为空): ```bash mount -t overlay overlay -o lowerdir=/mnt/lower,upperdir=/mnt/upper,workdir=/mnt/work /mnt/merged ``` 4. 现在,你可以通过`/mnt/merged`访问镜像内容,并且所有修改都会保存在`/mnt/upper`目录中。原始镜像文件不变。 卸载: ```bash umount /mnt/merged umount /mnt/lower ``` 然后可以删除创建的目录。 注意:这种方法在卸载后,修改都保存在`/mnt/upper`中。如果需要再次挂载并保留之前的修改,可以重复步骤23(使用相同的`/mnt/upper``/mnt/work`)。 ### 方法2:复制内容到可写目录并重新生成镜像(永久性修改) 这种方法适用于需要永久修改镜像内容的情况。 步骤: 1. 创建一个临时挂载点,挂载原始镜像(只读): ```bash mkdir /mnt/original mount -o ro /path/to/image.iso /mnt/original ``` 2. 创建一个目录用于存放镜像内容,并复制所有文件(保留权限): ```bash mkdir /path/to/copy cp -a /mnt/original/* /path/to/copy/ ``` 3. 卸载原始镜像: ```bash umount /mnt/original rmdir /mnt/original ``` 4. 现在,你可以在`/path/to/copy`中任意修改文件。 5. 修改完成后,使用`mkisofs`或`genisoimage`命令生成新的ISO镜像: ```bash genisoimage -o /path/to/new-image.iso -R -J /path/to/copy ``` 其中`-R`表示使用Rock Ridge协议(支持Unix/Linux的文件属性),`-J`表示生成Joliet扩展(用于Windows长文件名支持)。 6. 如果需要,可以删除临时目录`/path/to/copy`。 注意:这种方法会生成一个新的ISO文件,原始镜像保持不变。 ### 其他情况:修改raw格式镜像(如引用[3]) 如果镜像不是ISO格式,而是raw格式(如虚拟磁盘镜像),则可以使用环回设备挂载并修改。引用[3]提供了详细步骤: 1. 使用`losetup`关联镜像文件到环回设备(如`/dev/loop0`)。 2. 使用`kpartx`映射分区(如果镜像分区表)。 3. 挂载分区到目录(可读写挂载)。 示例: ```bash # 关联镜像 losetup /dev/loop0 abc.img # 映射分区 kpartx -a /dev/loop0 # 查看映射的分区,假设为/dev/mapper/loop0p1 fdisk -l /dev/loop0 # 挂载分区(可读写) mount /dev/mapper/loop0p1 /mnt/mydir ``` 修改完成后,卸载并解除映射: ```bash umount /mnt/mydir kpartx -d /dev/loop0 losetup -d /dev/loop0 ``` 注意:这种方法适用于raw格式镜像(如qcow2, raw, vmdk等),但ISO镜像通常不包含分区表,所以上述步骤不适用于ISO。 ### 总结 根据镜像格式需求选择合适的方法: - ISO镜像:推荐使用方法2(复制并重新生成)进行永久修改;或方法1(overlayfs)进行临时修改。 - raw格式镜像:使用环回设备kpartx(引用[3]的方法)进行挂载修改。 请根据实际情况选择方法。 §§相关问题§§ 1. 如何在不重新生成ISO的情况下修改已挂载的ISO镜像2. 使用overlayfs挂载镜像后,如何保存修改到新的ISO文件? 3. 如何修改其他格式镜像文件(如qcow2, vmdk)? 4. 在Windows系统中如何修改ISO镜像? 5. 如何创建可启动的ISO镜像?</think>### 如何修改挂载镜像的只读属性 要使挂载镜像文件可读写,需根据镜像格式操作系统选择合适的方法。以下是具体解决方案,分为临时修改永久修改两种方式: --- #### 一、临时修改挂载属性(无需解压镜像) 适用于需要临时修改镜像内容的情况。 ##### 1. **Linux系统(ISO/Rock Ridge镜像)** 通过 `mount` 命令的 `-o remount` 参数覆盖只读属性: ```bash # 先以只读方式挂载 sudo mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom # 重新挂载为可读写(需支持Rock Ridge) sudo mount -o remount,rw /mnt/cdrom ``` **注意**:仅当镜像文件系统支持 Rock Ridge 扩展(如引用[1]所述)时有效[^1]。 ##### 2. **Raw格式镜像(如虚拟磁盘)** 使用环回设备+映射分区(引用[3]方法): ```bash # 关联镜像到环回设备 sudo losetup -f --show -P raw_disk.img # 输出 /dev/loop0 # 映射分区 sudo kpartx -av /dev/loop0 # 挂载为可读写 sudo mount /dev/mapper/loop0p1 /mnt/raw -o rw ``` 修改后卸载: ```bash sudo umount /mnt/raw sudo kpartx -d /dev/loop0 sudo losetup -d /dev/loop0 ``` --- #### 二、永久修改镜像内容 适用于需要持久化修改的场景。 ##### 1. **提取→修改→重建镜像(推荐)** **步骤**: ```bash # 创建临时目录 mkdir /tmp/iso_content # 挂载镜像(只读) sudo mount -o ro source.iso /mnt/cdrom # 复制内容到可写目录 cp -a /mnt/cdrom/* /tmp/iso_content/ # 修改文件(示例) echo "New Content" > /tmp/iso_content/newfile.txt # 生成新ISO genisoimage -o modified.iso -R -J /tmp/iso_content ``` 此方法兼容所有ISO镜像(包括ISO-9660基础格式)[^1][^2]。 ##### 2. **Windows系统修改(DISM工具)** 适用于WIM格式镜像(引用[2]方法): ```cmd :: 挂载WIM镜像到可写目录 dism /Mount-Wim /WimFile:D:\sources\install.wim /Index:1 /MountDir:C:\mount :: 修改文件(直接操作C:\mount目录) echo "New Content" > C:\mount\newfile.txt :: 提交修改并卸载 dism /Unmount-Wim /MountDir:C:\mount /Commit ``` 修改后需用UltraISO或DISM++替换原ISO中的WIM文件[^2]。 --- #### 关键注意事项 1. **文件系统限制**: - 原生ISO-9660是只读文件系统,无法直接挂载为可写 - 修改需依赖Rock Ridge扩展(Linux)或重建镜像 2. **权限问题**: ```bash sudo chmod -R u+rw /mnt/cdrom # 尝试解除只读错误时使用 ``` 3. **虚拟化场景**: - Docker容器挂载目录(引用[4])需在启动时指定可写: ```bash docker run -v /host/path:/container/path:rw image_name ``` --- ### 相关问题 1. 如何检查ISO镜像是否支持Rock Ridge扩展? 2. 在Windows中如何永久修改ISO镜像的只读属性? 3. 使用kpartx映射分区时遇到"device busy"错误如何解决? 4. 如何在不复制整个镜像的情况下修改大型ISO文件? 5. 修改可启动ISO后如何保持其引导功能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值