在Debian系統(tǒng)中,磁盤映像技術(shù)是管理和維護(hù)數(shù)據(jù)存儲的一個強(qiáng)大工具,允許用戶創(chuàng)建整個磁盤或分區(qū)的快照,這些快照可以用于備份、恢復(fù)系統(tǒng)、或者在不同設(shè)備間遷移數(shù)據(jù)。本教程將介紹一系列的磁盤映像操作技巧,包括如何制作和處理各種類型的磁盤映像文件。
一、制作磁盤映像文件
一個未掛載設(shè)備(例如,第二個 SCSI 或 串行 ATA 設(shè)備 “/dev/sdb”)的磁盤映像文件 “disk.img” 可以使用 cp(1) 或 dd(1) 通過下列方式建立。
# cp /dev/sdb disk.img # dd if=/dev/sdb of=disk.img
傳統(tǒng) PC 中位于主 IDE 硬盤第一扇區(qū)的主引導(dǎo)記錄(MBR)的磁盤映像可以使用 dd(1) 通過下列方式建立。
# dd if=/dev/hda of=mbr.img bs=512 count=1 # dd if=/dev/hda of=mbr-nopart.img bs=446 count=1 # dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
- “mbr.img”:帶有分區(qū)表的 MBR;
- “mbr-nopart.img”:不帶分區(qū)表的 MBR;
- “mbr-part.img”:僅 MBR 的分區(qū)表。
如果使用 SCSI 或 串行 ATA 設(shè)備作為啟動硬盤,需要使用 “/dev/sda” 替代 “/dev/hda”。如果要建立原始硬盤的一個硬盤分區(qū)的映像,需要使用 “/dev/hda1” 等替代 “/dev/hda”。
二、直接寫入硬盤
磁盤映像文件 “disk.img” 可以通過下列方式寫入到一個匹配大小的未掛載設(shè)備(例如,第二個 SCSI 設(shè)備 “/dev/sdb”。
# dd if=disk.img of=/dev/sdb
相似地,硬盤分區(qū)映像文件 “partition.img” 可以通過下列方式寫入到匹配大小的未掛載分區(qū)(例如,第二個 SCSI 設(shè)備的第一個分區(qū) “/dev/sdb1”)。
# dd if=partition.img of=/dev/sdb1
三、掛載磁盤映像文件
可以使用循環(huán)設(shè)備通過下列方式掛載和卸載包含單個分區(qū)映像的磁盤映像 “partition.img”。
# losetup -v -f partition.img Loop device is /dev/loop0 # mkdir -p /mnt/loop0 # mount -t auto /dev/loop0 /mnt/loop0 ...hack...hack...hack # umount /dev/loop0 # losetup -d /dev/loop0
可以簡化為如下步驟。
# mkdir -p /mnt/loop0 # mount -t auto -o loop partition.img /mnt/loop0 ...hack...hack...hack # umount partition.img
可以使用 循環(huán)設(shè)備 掛載包含多個分區(qū)的磁盤映像 “disk.img” 的每個分區(qū)。因?yàn)檠h(huán)設(shè)備默認(rèn)不管理分區(qū),因此我們需要通過下列方式重新設(shè)置它。
# modinfo -p loop # verify kernel capability max_part:Maximum number of partitions per loop device max_loop:Maximum number of loop devices # losetup -a # verify nothing using the loop device # rmmod loop # modprobe loop max_part=16
現(xiàn)在循環(huán)設(shè)備可以管理多達(dá) 16 個分區(qū)。
# losetup -v -f disk.img Loop device is /dev/loop0 # fdisk -l /dev/loop0 Disk /dev/loop0: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x452b6464 Device Boot Start End Blocks Id System /dev/loop0p1 1 600 4819468+ 83 Linux /dev/loop0p2 601 652 417690 83 Linux # mkdir -p /mnt/loop0p1 # mount -t ext4 /dev/loop0p1 /mnt/loop0p1 # mkdir -p /mnt/loop0p2 # mount -t ext4 /dev/loop0p2 /mnt/loop0p2 ...hack...hack...hack # umount /dev/loop0p1 # umount /dev/loop0p2 # losetup -d /dev/loop0
或者,也可以使用 kpartx 軟件包中的 kpartx(8) 建立 設(shè)備映射設(shè)備來達(dá)到相同的效果。
# kpartx -a -v disk.img ... # mkdir -p /mnt/loop0p2 # mount -t ext4 /dev/mapper/loop0p2 /mnt/loop0p2 ... ...hack...hack...hack # umount /dev/mapper/loop0p2 ... # kpartx -d /mnt/loop0
也可以使用循環(huán)設(shè)備利用偏移量來跳過 MBR 等,來掛載此類磁盤映像的單個分區(qū)。但這更加容易出錯。
四、清理磁盤映像文件
使用下面的方式,一個磁盤映像文件 “disk.img” 能夠清理掉所有已經(jīng)刪除的文件,成為一個干凈的稀疏映像 “new.img”。
# mkdir old; mkdir new # mount -t auto -o loop disk.img old # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G # mount -t auto -o loop new.img new # cd old # cp -a --sparse=always ./ ../new/ # cd .. # umount new.img # umount disk.img
如果 “disk.img” 位于 ext2、ext3 或 ext4,也可以像下面那樣使用 zerofree 軟件包中的 zerofree(8)。
# losetup -f -v disk.img Loop device is /dev/loop3 # zerofree /dev/loop3 # cp --sparse=always disk.img new.img
五、制作空的磁盤映像文件
按下面的方式使用 dd(1) ,可以制作一個大小為 5GiB 的空磁盤映像文件。
$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G
專業(yè)的 fallocate(8) 可以在這里被使用,用來替代使用 dd(1)。
按下面的方式使用環(huán)回設(shè)備,能夠在這個磁盤映像”disk.img”上創(chuàng)建 ext4 文件系統(tǒng)。
# losetup -f -v disk.img Loop device is /dev/loop1 # mkfs.ext4 /dev/loop1 ...hack...hack...hack # losetup -d /dev/loop1 $ du --apparent-size -h disk.img 5.0G disk.img $ du -h disk.img 83M disk.img
對于 “disk.img”,它的文件大小是5.0 GiB,而它實(shí)際磁盤使用僅僅是 83MiB.這個差距可能是由于 ext4 里面有稀疏文件.
注意:稀疏文件的實(shí)際磁盤使用會隨著數(shù)據(jù)的寫入而增加。
回環(huán)設(shè)備或設(shè)備映射設(shè)備上使用類似的操作,在這些設(shè)備掛載后, 能夠使用 parted(8) 或 fdisk(8)對這個磁盤映像”disk.img”進(jìn)行分區(qū),能夠使用 mkfs.ext4(8), mkswap(8)在上面創(chuàng)建文件系統(tǒng)等.
六、制作ISO9660鏡像文件
“源目錄”下的目錄樹可以通過如下所示的 cdrkit 提供的 genisoimage(1) 命令來制作 ISO9660 鏡像文件,”cd.iso”。
# genisoimage -r -J -T -V volume_id -o cd.iso source_directory
類似的,可引導(dǎo)的 ISO9660 鏡像文件,”cdboot.iso”, 能夠從 debian-installer 類似目錄樹 “source_directory” 制作,方式如下。
# genisoimage -r -o cdboot.iso -V volume_id \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table source_directory
這里的 Isolinux boot loader是用于啟動的.按下面的方式,可以直接從光驅(qū)設(shè)備計算 md5sum 值,并制作 ISO9660 鏡像。
$ isoinfo -d -i /dev/cdrom CD-ROM is in ISO 9660 format ... Logical block size is: 2048 Volume size is: 23150592 ... # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
注意:為了得到正確結(jié)果,必須小心避免 Linux ISO9600 文件系統(tǒng)預(yù)讀 bug。
七、直接寫入文件
對于由 cdrkit 提供的 wodim(1) 來講,DVD 僅僅是一個大的 CD。能夠通過如下所示的命令找到可用的設(shè)備。
# wodim --devices
然后將空的 CD-R 插入 CD 驅(qū)動器并且把 ISO9660 鏡像文件,”cd.iso” 寫入到設(shè)備中,例如用如下所示的 wodim(1) 將數(shù)據(jù)寫入到 “/dev/hda” 設(shè)備。
# wodim -v -eject dev=/dev/hda cd.iso
如果用 CD-RW 代替 CD-R,用如下所示的命令來替代。
# wodim -v -eject blank=fast dev=/dev/hda cd.iso
如果桌面系統(tǒng)自動掛載 CDs,在使用 wodim(1) 之前在終端里面用 “sudo umount /dev/hda” 卸載它。
八、掛載ISO9660鏡像文件
如果 “cd.iso” 包含一個 ISO9660 鏡像, 下面的命令手工掛載這個文件到 “/cdrom”.
# mount -t iso9660 -o ro,loop cd.iso /cdrom
現(xiàn)代桌面系統(tǒng)能夠自動掛載可移動介質(zhì),如按 ISO9660 格式化的 CD