[Nếu tất cả những gì bạn muốn làm là thu nhỏ phân vùng trên thẻ, có một cách đơn giản hơn để làm điều này hơn là giải thích ở đây trước tiên bằng cách sử dụng resize2fs
trên hệ thống tệp, sau đó sử dụng fdisk
để thu nhỏ phân vùng; cần có nhiều ví dụ về điều này trên mạng, ví dụ, tại Unix & Linux . Phương pháp dưới đây liên quan đến việc tạo một hình ảnh thẻ mới, nhỏ hơn. Dù bằng cách nào, bạn không thể làm điều này với một hệ thống đang chạy.]
Bạn không thể thu nhỏ hình ảnh thiết bị (mặc dù bạn có thể thu nhỏ một hệ thống tệp riêng lẻ resize2fs
), nhưng bạn có thể tạo một trong bất kỳ kích thước nào và sao chép nội dung của một hệ thống khác. Tôi sẽ thảo luận điều này liên quan đến Raspbian nhưng nó cũng tương tự đối với bất kỳ hệ thống GNU / Linux nào khác.
Một hình ảnh thiết bị là dành cho mục đích của chúng tôi một byte hoàn chỉnh cho byte bản sao của một phương tiện thiết bị khởi động như một thẻ SD, có thể chứa số không hay nhiều phân vùng hệ thống tập tin. Điều này khác với một hình ảnh hệ thống tập tin , là một byte cho bản sao byte của một phân vùng duy nhất. Xem ở đây để biết thêm về những khác biệt quan trọng.
Câu trả lời này mô tả cách tạo hình ảnh thiết bị với các phân vùng hệ thống tệp trong đó, nhưng các phân vùng đó sẽ trống. Sau đó, bạn cần phải sao chép nội dung của từng phân vùng theo câu trả lời khác của tôi ở đây . Đây là phương pháp linh hoạt nhất.
Một số lệnh này cần được chạy root nên tôi khuyên bạn chỉ nên su root
. Bạn có thể sử dụng chính pi để làm điều này nếu bạn có dung lượng lưu trữ đủ lớn.
Có hai phân vùng trong hình ảnh Raspbian, phân vùng khởi động nhỏ đầu tiên và hệ thống tập tin gốc lớn thứ hai. Ngoài ra còn có một bảng phân vùng, aka. bản ghi khởi động chính (MBR), vì đây là hình ảnh thiết bị . MBR rất quan trọng và chiếm 512 byte đầu tiên trong ảnh.
Một hình ảnh thiết bị bắt đầu như một tập tin trống. Bạn cần phải quyết định bạn muốn nó lớn đến mức nào; du -h
và df
có thể hữu ích trong vấn đề này (xem man du
và man df
; tất cả các lệnh bên dưới cũng có các trang man có giá trị ít nhất là một cái nhìn).
Tôi sẽ sử dụng một cái nhỏ làm ví dụ.
dd if=/dev/zero of=test.img bs=4096 count=10240
Đó là ~ 40 MiB; tổng kích thước được xác định bởi bs
* count
, đơn vị mặc định là byte. Tập tin trống này bây giờ có thể được coi là một thiết bị.
fdisk test.img
Fdisk có tính tương tác và sẽ lưu ý rằng "thiết bị không chứa bảng phân vùng được công nhận". Điều đầu tiên bạn phải làm là tạo một cái. Một thiết bị được định dạng MBR sử dụng bảng phân vùng DOS và fdisk
lệnh để tạo o.
Command (m for help): o
Created a new DOS disklabel with disk identifier 0xe7a0dfdf.
Bạn có thể thấy bảng trống với p. Bây giờ chúng ta cần tạo hai phân vùng mới với n.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-79999, default 2048): 8192
Lưu ý tôi đã không sử dụng giá trị mặc định; 8192 là những gì được sử dụng trong các hình ảnh Raspbian thực tế và dường như là một thông lệ phổ biến với thẻ SD. 1 Trong hình ảnh Raspbian, phân vùng này là ~ 56 MB và do đó kết thúc tại sector 122879. Nó không phải lớn như vậy nhưng bạn cũng có thể sao chép mô hình. Tuy nhiên, trong ví dụ này không có đủ dung lượng, vì vậy tôi đã sử dụng 10 MB:
Last sector, +sectors or +size{K,M,G,T,P} (8192-79999, default 79999): +10M
Theo mặc định, loại phân vùng là "Linux". Chúng ta cần thay đổi điều đó.
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): c
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.
Bây giờ phân vùng thứ hai.
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p.
Partition number (2-4, default 2): 2
First sector (2048-79999, default 2048): 28672
Thông báo lại tôi đã không sử dụng mặc định; bởi vì chúng tôi đã để lại không gian trống ở đầu, fdisk vẫn muốn sử dụng nó. Thay vào đó tôi đã sử dụng khu vực 2 số sau khi lĩnh vực cuối cùng của phân vùng đầu tiên, bạn có thể tìm thấy trong bảng phân vùng (đó là End
).
Đối với khu vực cuối cùng, tôi đã chọn giá trị cao nhất có thể (79999) để điền vào toàn bộ tệp hình ảnh.
Khi đã tạo xong, bảng trông như thế này:
Device Boot Start End Blocks Id System
test.img1 8192 28671 10240 c W95 FAT32 (LBA)
test.img2 28672 79999 25664 83 Linux
Đó là tất cả những gì chúng ta cần ở đây, nhưng để chống lại những sai lầm, fdisk không thực sự làm gì cho đến khi bạn nhấn w. Tại thời điểm đó, nó sẽ viết ra bảng mới và thoát. Để kiểm tra:
> file test.img
test.img: ; partition 1 : ID=0xc, start-CHS (0x0,130,3), end-CHS (0x1,200,7), startsector 8192, 20480 sectors; partition 2 : ID=0x83, start-CHS (0x1,200,8), end-CHS (0x4,249,53), startsector 28672, 51328 sectors
Nó được công nhận là một thiết bị có phân vùng hệ thống tập tin. Những người cần phải được định dạng. Để làm điều này, chúng ta cần chỉ ra các vùng thích hợp của tệp hình ảnh dưới dạng các hệ thống tệp cho HĐH. Đầu tiên:
losetup -o 4194304 /dev/loop1 ./test.img
losetup -o 14680064 /dev/loop2 ./test.img
Các -o
giá trị offset ( ) này là các Start
số từ bảng phân vùng, 8192 và 28672, nhân với kích thước đơn vị (512). Bây giờ chúng tôi có các phân vùng thiết bị có thể được định dạng:
> mkfs.vfat -F32 /dev/loop1
mkfs.fat 3.0.27 (2014-11-12)
Loop device does not match a floppy size, using default hd params
> mkfs.ext4 /dev/loop2
Đó là cảnh báo về kích thước đĩa mềm có thể được bỏ qua. Lệnh thứ hai sẽ tạo ra nhiều đầu ra hơn nhưng không nên có bất kỳ lỗi nào được báo cáo. Bây giờ chúng ta có thể kiểm tra các hệ thống tập tin; đầu tiên loại bỏ các thiết bị lặp với losetup -D
, sau đó tạo một vài thư mục và mount
phân vùng hình ảnh ở đó:
mkdir one; mkdir two
mount -o offset=4194304 -t vfat test.img one
mount -o offset=14680064 -t ext4 test.img two
Điều này sẽ không báo cáo bất kỳ lỗi nào (nếu bạn nhận được "vòng lặp chồng chéo", xem tại đây và tìm kiếm trang cho "vòng lặp chồng chéo"). one
sẽ trống, và two
nên có một lost+found
thư mục trong đó.
Bây giờ bạn có thể sao chép bất cứ điều gì bạn muốn vào những điểm gắn kết, ví dụ, bạn có thể lặp lại một pi sử dụng rsync
, theo đó khác Q & A liên kết trước đó . Khi bạn hoàn tất, umount
các thư mục và bạn có thể dd
test.img vào thẻ SD và sử dụng nó.
1. Nếu bạn đang cố sao chép một số hình ảnh / thẻ khác ngoài hình ảnh Raspbian, bạn có thể nhận được những con số này bằng cách xem bảng phân vùng của hình ảnh / thẻ theo cùng một cách fdisk
.
2. Nói chung, các đơn vị được sử dụng bởi fdisk được chỉ định khi bạn xem bảng phân vùng (ví dụ Units: sectors of 1 * 512 = 512 bytes
) nhưng hãy cẩn thận rằng nó cũng có thể được tham chiếu Blocks
trong bảng (như trên) là 1 KiB. Điều này có thể gây nhầm lẫn bởi vì Start
và End
số liệu không nằm trong "khối", chúng nằm trong các đơn vị được chỉ định ở trên cùng. Ở đây là 1/2 KiB, do đó, khoảng cách giữa các số liệu này gấp đôi số lượng Blocks
. Không phải tất cả các phiên bản fdisk
làm điều này, một số báo cáo Sectors
, có ý nghĩa hơn.