介绍
对于具有PC分区的驱动器(在大多数USB记忆棒中都可以找到),引导加载程序仅占驱动器最开始的一小部分(阶段1引导加载程序,位于驱动器的引导扇区),其他部分(文件中的第2阶段引导程序)的较大部分。第1阶段的数据包含第2阶段的物理位置。如果您复制整个设备(您尝试使用的方式dd
),则第1阶段的部分位于相同的物理位置,并且该控制棒可以工作,但是新的控制棒必须至少为和原来一样大。如果您重新创建分区并复制文件,那么您将丢失阶段1,因为它不是文件。
我认为(但我没有检查过)阶段2位于第一个(FAT32)分区中。如果是这样,则可以批量复制该分区,也可以复制启动扇区,然后编辑分区表,以使第二个分区恰好占据剩余空间,然后在第二个分区上复制文件。您也可以将引导扇区和第一个分区的原始映像保存在硬盘上的文件中(但是您也可以从USB记忆棒克隆它们)。
制作不同大小的克隆
下面我将称为包含原始棍子/dev/sdb
的设备和包含克隆的设备/dev/sdc
; 根据需要替换名称。如果需要,请创建安装点。我假设FAT32分区(在磁盘的开头)编号为1,而ext3分区编号为2;如果需要,请替换不同的数字。
第一部分,如果从棍子克隆:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
第一部分,如果从图像文件克隆:
cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1
partprobe
需要进行调用,以便内核从磁盘重新加载分区表(它位于引导扇区中,并且上述两种情况下的第一个命令都会修改引导扇区)。如果您忽略它,您将得到错误,否则内核将以静默方式将垃圾写入控制棒。
制作图像文件:
head -c 512 </dev/sdb >boot_sector.img
cat /dev/sdb1 >first_partition.img
现在,有了引导扇区和第一个分区后,您需要再次编辑分区表,以调整第二个分区的大小。您可以通过将正确的输入输入来自动执行此操作fdisk
。警告,这非常容易出错,而且我还没有测试过。如果您对这一部分不完全满意,请手动进行。
sed -e 's/ *#.*//' <<EOF | tr -s ' ' '\n' | tr -d _ | fdisk /dev/sdc
d 2 # delete partition 2
n p 2 # new primary partition 2...
_ _ # ... using all available space
w q # write and quit
EOF
最后,再次重新加载分区表,创建ext3文件系统,然后将文件复制到那里。
partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2
简化的方法可克隆更大
如果愿意,可以存储整个棍子的图像。您将能够直接在至少大小相同的任何棒上使用该映像:只需使用将该映像复制到新棒上cat <whole.img >/dev/sdc
,然后运行partprobe /dev/sdc
(或拔下棒再将其放回去)以重新读取分区表。
然后,如果您愿意,可以扩大克隆。按此顺序:
- 扩大分区。不幸的是,我不知道如何简单地做到这一点。
parted
可以使用move
命令(不是resize
,它会调整文件系统的大小)来执行此操作,但是您需要找出正确的参数-切换到扇区(unit s
)以避免舍入错误。
- 扩大文件系统。这部分很简单:只需运行
resize2fs /dev/sdc2
以使文件系统使用整个分区大小即可。
如果您使用的棒比必要的大,则可以按照相反的顺序按照上述步骤进行收缩(首先使用收缩文件系统resize2fs
,然后使用收缩分区parted
)。
或者,您可以先将操纵杆复制到一个图像文件,然后对该图像文件进行处理。要访问分区,请使用循环设备,特别是将文件的一部分与磁盘相关联。如果您要缩小图像(警告,未经测试,仔细进行并仔细检查数学),这是步骤的草图。
fdisk -lu whole.img # note starting sector of partition 2: $S
losetup -fs -o $(($S * 512)) whole.img
# Let $D be the desired size of partition 2, in kB
resize2fs /dev/loop0 $ # replace /dev/loop0 by whatever losetup prints
losetup -d /dev/loop0
parted whole.img
# Use parted to resize the second partition
dd if=/dev/null of=/file/to/truncate seek=1 bs=$(($S/2+$D+1))k