Giới thiệu
Đối với ổ đĩa có phân vùng PC (là thứ bạn sẽ tìm thấy trên hầu hết các thanh USB), bộ nạp khởi động bao gồm một phần nhỏ ở đầu ổ đĩa (bộ tải khởi động giai đoạn 1, trong khu vực khởi động của ổ đĩa) và một phần lớn hơn ở nơi khác (bộ tải khởi động giai đoạn 2, trong một tệp). Dữ liệu của giai đoạn 1 chứa vị trí vật lý của giai đoạn 2. Nếu bạn sao chép toàn bộ thiết bị (những gì bạn đã thử dd
), phần của giai đoạn 1 nằm ở cùng một vị trí thực tế và thanh hoạt động, nhưng thanh mới ít nhất phải là lớn như bản gốc. Nếu bạn tạo lại các phân vùng và sao chép các tệp, bạn đang thiếu giai đoạn 1 vì đó không phải là một tệp.
Tôi nghĩ (nhưng tôi chưa kiểm tra) rằng giai đoạn 2 nằm trong phân vùng đầu tiên (FAT32). Nếu vậy, bạn có thể sao chép phân vùng bán buôn đó và sao chép cung khởi động, sau đó chỉnh sửa bảng phân vùng để phân vùng thứ hai chiếm chính xác không gian còn lại và sao chép các tệp trên phân vùng thứ hai. Bạn cũng có thể giữ một hình ảnh thô của khu vực khởi động và phân vùng đầu tiên trong một tệp trên đĩa cứng (nhưng bạn cũng có thể sao chép chúng từ thẻ nhớ USB).
Tạo một bản sao có kích thước khác
Dưới đây tôi sẽ gọi thiết bị chứa thanh gốc /dev/sdb
và thiết bị chứa bản sao /dev/sdc
; thay thế tên khi cần thiết. Tạo điểm gắn kết nếu cần. Tôi giả sử rằng phân vùng FAT32 (ở đầu đĩa) được đánh số 1 và phân vùng ext3 được đánh số 2; thay số khác nhau nếu cần.
Phần đầu tiên, nếu nhân bản từ một cây gậy:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
Phần đầu tiên, nếu nhân bản từ các tập tin hình ảnh:
cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1
Cuộc gọi đến partprobe
là cần thiết để kernel tải lại bảng phân vùng từ đĩa (đó là trong khu vực khởi động và lệnh đầu tiên trong cả hai trường hợp trên sẽ sửa đổi khu vực khởi động). Nếu bạn bỏ qua nó, bạn sẽ gặp lỗi hoặc kernel sẽ âm thầm ghi rác vào thanh.
Để tạo các tập tin hình ảnh:
head -c 512 </dev/sdb >boot_sector.img
cat /dev/sdb1 >first_partition.img
Bây giờ sau khi bạn đã có khu vực khởi động và phân vùng đầu tiên, bạn cần chỉnh sửa lại bảng phân vùng, để thay đổi kích thước phân vùng thứ hai. Bạn có thể làm điều này tự động bằng cách cung cấp đúng đầu vào fdisk
. Cảnh báo, điều này rất dễ bị lỗi và tôi đã không kiểm tra nó. Nếu bạn không cảm thấy hoàn toàn thoải mái với phần này, hãy làm nó bằng tay.
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
Cuối cùng tải lại bảng phân vùng một lần nữa, tạo một hệ thống tệp ext3 và sao chép các tệp ở đó.
partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2
Phương pháp đơn giản hóa để tạo một bản sao lớn hơn
Nếu bạn thích, bạn có thể lưu trữ một hình ảnh của toàn bộ thanh. Bạn sẽ có thể sử dụng hình ảnh đó trực tiếp trên bất kỳ thanh nào có kích thước lớn nhất: chỉ cần sao chép hình ảnh đó vào thanh mới cat <whole.img >/dev/sdc
, sau đó chạy partprobe /dev/sdc
(hoặc rút phích cắm và đặt lại vào) để đọc lại bảng phân vùng.
Sau đó, nếu bạn thích, bạn có thể phóng to bản sao. Theo thứ tự này:
- Phóng to phân vùng. Thật không may, tôi không biết làm thế nào để làm điều này một cách đơn giản.
parted
có thể làm điều đó với move
lệnh (không resize
thay đổi kích thước hệ thống tập tin), nhưng bạn cần tìm ra các đối số phù hợp - chuyển sang sector ( unit s
) để tránh lỗi làm tròn.
- Phóng to hệ thống tập tin. Phần đó rất dễ: chỉ cần chạy
resize2fs /dev/sdc2
để làm cho hệ thống tập tin sử dụng toàn bộ kích thước phân vùng.
Nếu bạn bắt đầu từ một thanh lớn hơn mức cần thiết, bạn có thể thu nhỏ nó bằng cách làm theo các bước ở trên theo thứ tự ngược lại (đầu tiên thu nhỏ hệ thống tệp với resize2fs
, sau đó thu nhỏ phân vùng bằng parted
).
Ngoài ra, trước tiên bạn có thể sao chép thanh vào một tệp hình ảnh, sau đó làm việc trên tệp hình ảnh đó. Để truy cập các phân vùng, sử dụng một thiết bị lặp , đặc biệt liên kết một phần của tệp với đĩa . Dưới đây là bản phác thảo các bước nếu bạn muốn thu nhỏ hình ảnh (cảnh báo, chưa được kiểm tra, tiến hành cẩn thận và kiểm tra lại toán học).
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