Làm cách nào để tạo một hình ảnh (.img) từ những gì trên thẻ SD (nhưng nhỏ gọn như ảnh gốc)?


20

Tôi đã thử:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

Nó tạo ra một tệp .img với 7.6 GB (kích thước thẻ, NHƯNG những gì trên thẻ có 700 MB).

Và:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

tạo tệp .gz với 2,7 GB.

Bản gốc Raspbian ( Debian 7 (Wheezy)) từ http://www.raspberrypi.org/doads có 494,44 MiB.

Từ những gì trên thẻ SD, làm cách nào tôi có thể tạo một hình ảnh có kích thước tương tự?

(Tôi đang dùng Ubuntu.)


raspberrypi.stackexchange.com/questions/311/ ' Điều này không giúp được gì
mf_

Câu trả lời:


18

Bạn đề cập trong một nhận xét cho RooTer rằng A) bạn đã giảm kích thước phân vùng ban đầu gparted, nhưng ddvẫn sao chép toàn bộ thẻ và B) mà bạn muốn bao gồm cả hai phân vùng trong hình ảnh.

Vấn đề "A" rất dễ giải thích: bạn vẫn đang sao chép toàn bộ thẻ vì đó là những gì /dev/mmcblk0đề cập đến. Các phân vùng riêng là tất nhiên /dev/mmcblk0p1/dev/mmcblk0p2. Đây là sự phức tạp trong vấn đề "B", nhưng bạn không thể đơn giản ddtừng phân vùng và ghép hai tệp lại với nhau, vì bảng phân vùng ở đầu /dev/mmcblk0 chỉ mục bắt đầu và độ dài của mỗi phân vùng. Không có điều đó, hình ảnh sẽ không thể sử dụng được.

Tuy nhiên, bạn có thể lấy chiều dài của mỗi phân vùng fdisk -lvà sử dụng nó để xác định một số tham số cho dd. Ví dụ:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 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
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

Các đơn vị "Bắt đầu" và "Kết thúc" là các cung và thông báo kích thước cung được đưa ra là 512 byte. Đối với /dev/mmcblk0p2, 26746879 (khu vực cuối cùng) - 122880 (khu vực đầu tiên) = 26623999/2 (cho 2 lĩnh vực trên mỗi kB) / 1024 (kB mỗi MB) / 1024 (MB mỗi GB) = 12,69, tôi đã tăng phân vùng bằng cách sử dụng gparted đến 12 GB, do đó, điều này có vẻ chính xác (thực sự tôi nên sử dụng 1000 chứ không phải 1024 là số chia với dung lượng lưu trữ, hoạt động lên tới 13,31 GB, nhưng tôi nghi ngờ gparted và một số công cụ khác cũng sử dụng 1024).

Vì vậy, điều đầu tiên bạn muốn kiểm tra là phân vùng thứ hai của bạn thực sự có kích thước nhỏ hơn mà bạn đặt nó. Tiếp theo, chỉ cần sử dụng những số đó với dd; đối với tôi nó sẽ là:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

Tôi đã có thêm một lĩnh vực ở đó để tránh bất kỳ loại bỏ bởi một sự hiểu lầm về cách làm ddviệc. Có một cách đơn giản để kiểm tra xem cái này có hiệu quả không:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 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
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

Lưu ý rằng có một chút khác biệt ở đây: các phần "Bắt đầu" và "Kết thúc" khớp với bảng phân vùng ban đầu, nhưng tổng kích thước trong các số liệu thống kê lên trên chỉ là 102 MB! Điều này là do tôi thực sự đã sử dụng count=200000làm thông số ddvì tôi không thực sự muốn làm phiền với bản sao 12 GB (cũng lưu ý "tổng số 200000 lĩnh vực"). Lý do bảng ở phía dưới không phản ánh điều này là do fdisk đang lấy thông tin từ dữ liệu phân vùng được sao chép nguyên văn ở đầu hình ảnh từ đầu thẻ SD, như tôi đã đề cập trong đoạn thứ hai, là rất quan trọng để duy trì. Nếu tôi đã sao chép (đúng) phần còn lại, các con số sẽ là copacetic và hình ảnh sẽ khả thi.

Hãy thử xem. :)


Trên OSX, fdisk không in rõ ràng kích thước cung theo byte. Nó cung cấp thay vì "hình học: 966/255/63 [15523840 ngành]" đại diện cho hình trụ / đầu / lĩnh vực. Giá trị nào của bs và đếm nên được sử dụng trong trường hợp này?
Arthur Hebert

@ArthurHebert: Tổng số byte / tổng số ngành. Ví dụ như trong trường hợp đầu tiên ở trên nó sẽ là 16138633216/31520768 = 512, trong lần thứ hai 102400000/200000 = 512.
Goldilocks

1
Bạn có thể sử dụng fdisk -l <device>và nên in bảng mà không cần chuyển sang chế độ tương tác.
berto

5

Tôi đoán vấn đề nằm ở những khu vực đã từng sử dụng mà vẫn có bụi bẩn trong đó. Khi tệp bị xóa, chỉ có siêu dữ liệu được xóa khỏi hệ thống tệp chứ không phải dữ liệu, do đó để lại một số không ngẫu nhiên thay vì dễ nén các khối chỉ không.

Giải pháp dễ dàng, nhưng yêu cầu viết lại tất cả không gian trống trên thẻ. Hãy nhớ rằng tuổi thọ của thẻ SD bị giới hạn bởi số lần ghi lại, vì vậy đây không phải là phương pháp ưa thích.

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

Giải pháp liên quan hơn, vì bạn cần cài đặt zerofree trên một máy tính khác sẽ không sử dụng thẻ SD đó vào thời điểm đó.

zerofree /dev/mmcblk0p2

Để biết thêm chi tiết về http://intgat.tigress.co.uk/rmy/uml/index.html

Điều bạn phải nhớ là khi thực hiện dd / dev / mmcblk0, bạn sao chép toàn bộ thiết bị, ngay cả khi các phân vùng nhỏ hơn. Nếu bạn đã sử dụng raspi-config để mở rộng phân vùng chính trước khi thực hiện một trong các phương pháp trên, bạn sẽ ổn.

PS Nếu bạn không thay đổi tệp hình ảnh định dạng, bạn có thể sử dụng partimage mà đối với các hệ thống tệp đã biết sẽ bỏ qua các khối được giải phóng ngay cả khi chúng vẫn còn một số bụi bẩn trong đó. Một lần nữa partimage được sử dụng tốt nhất khi hệ thống tập tin không được gắn kết để tránh tham nhũng sao lưu. Bạn có thể có thể thoát khỏi việc chỉ đọc nó, nhưng tôi sẽ để nó theo ý của bạn.


Là một phần trong nhiệm vụ của tôi khi cố gắng hoàn thành việc này, tôi đã sử dụng gparted để giảm phân vùng sdcard để chỉ lấy dữ liệu tôi có, sau đó tôi đã thử dd ing và kết quả là cùng một tệp 7.6GB, partimage không thể lưu 2 phân vùng (/ khởi động + /) thành 1 hình ảnh
mf_

có lẽ tôi đã không làm cho nó đủ rõ ràng - nó sẽ tạo ra sự khác biệt khi bạn nén nó, như bạn đã thử với gzip trước đây.
RooTer

Làm đầy thẻ theo cách này sẽ gây ra một loạt các chu kỳ ghi và sẽ rút ngắn tuổi thọ của thẻ. thửdd bs=4M if=/dev/zero of=/root/junk
nc4pk

@
taps

4

Câu trả lời ngắn - sử dụng thẻ SD 2GB.

Câu trả lời dài, ddkhông biết dữ liệu "tốt" kết thúc ở đâu, bạn phải nói bằng cách nào đó.

Có hai cách, dễ nhất là sử dụng thẻ SD 2GB, nó sẽ tự động dừng sao chép vượt quá 2GB và sẽ dẫn đến tệp nén 500MB như bạn mong muốn.

Một cách khác, phức tạp hơn một liên quan, là tính toán kích thước dữ liệu chính xác từ bảng phân vùng của bạn và chỉ định kích thước chính xác này làm tham số cho ddlệnh. Bạn có thể sử dụng các tham số bs=XXX(kích thước khối) và count=XXX(số khối) cho mục đích đó. Ví dụ: bạn có thể chỉ định bs=10Mkích thước khối 10MB (điều đó chắc chắn sẽ giúp sao chép nhanh hơn nhiều so với kích thước khối 4k bạn sử dụng trong các lệnh của mình) và count=200sao chép 10MB * 200 = 2000MB (2GB). Bạn có thể cần điều chỉnh kích thước khối và số khối theo sơ đồ phân vùng thẻ SD của mình .


1
Đưa ra ddmột kích thước cụ thể sẽ KHÔNG BAO GIỜ làm việc. Giả sử tất cả dữ liệu thực tế trong hệ thống tệp được sắp xếp gọn gàng ở đầu thiết bị, vì vậy nếu bạn có 2GB trên phân vùng 8 GB, bạn chỉ cần sao chép 2GB đầu tiên. Điều này là sai. 2 GB dữ liệu đó sẽ được phân tán trên toàn bộ không gian, đặc biệt là trên thẻ SD hiện đại không sử dụng lại các khối hai lần cho đến khi tất cả các khối có sẵn đã được sử dụng ít nhất một lần (điều này được gọi là cân bằng hao mòn và kéo dài tuổi thọ của thẻ).
goldilocks

@goldilocks nếu tôi thay đổi kích thước sdcard để thu nhỏ tất cả các phân vùng đến kích thước tối đa có thể (chỉ dữ liệu) ??
mf_

@goldilocks xin vui lòng, đọc câu hỏi và câu trả lời cẩn thận hơn, tôi đang nói về phân vùng 2GB trên thẻ SD 8GB, không phải về dữ liệu 2GB trên phân vùng 8GB, như trí tưởng tượng hoang dã của bạn bằng cách nào đó đã nói với bạn.
lenik

1
lenik: Vâng tôi hơi choáng váng Tôi đã giải thích cho bạn theo cách đó, tất cả lời xin lỗi - thật không may tôi không thể đảo ngược ý kiến ​​của mình trừ khi bạn chỉnh sửa bài đăng: / mặc dù tôi vẫn không nghĩ câu trả lời này đặc biệt hữu ích (không vi phạm - - bởi vì đây không chỉ đơn giản là một phân vùng , hướng dẫn về cách làm như vậy, một lần nữa, không hữu ích), nhưng tôi sẽ làm điều đó. @mf_ Vâng, điều đó là có thể làm được (bạn đã đọc câu trả lời của tôi chưa? Nó sẽ hoạt động ...)
goldilocks

@goldilocks Tôi đã chỉnh sửa câu trả lời. Không biết tại sao nó không hữu ích, đặc biệt là khi bạn đưa ra câu trả lời chính xác, chỉ với nhiều chi tiết hơn.
lenik

1

dd - copy and convertkhông phải là công cụ phù hợp để thực hiện công việc bạn yêu cầu. Nó là một công cụ cấp thấp, theo từng khu vực (và chuyển đổi), rất tuyệt vời để sao chép các phần khởi động, định dạng thiết bị và tất cả các loại tác vụ cấp thấp. Khi bạn sử dụng, ddbạn đang sao chép từng khu vực vào hình ảnh, ngay cả khi nó không được bao gồm trong Cấu trúc hệ thống tệp.

Các hình ảnh được cung cấp bởi nền tảng Raspberry Pi, là các hình ảnh được biên dịch đặc biệt với các tập lệnh cài đặt, giải nén nhị phân và thiết lập ban đầu, sau đó bạn phải nhận các bản cập nhật từ internet - Dù sao cũng là một công việc có chủ ý nhưng khá là nhiệm vụ để làm cho nó hoạt động như thế này.

Một giải pháp phổ biến để tránh sao chép các thành phần trống là sử dụng hệ thống sao chép Cấp độ tệp - và CloneZilla là độc lập, có thể khởi động từ đĩa CD, tương tự như ye olde Norton Ghostnhưng clonezilla hỗ trợ các hệ thống tệp Linux (và hơn thế nữa). Vì vậy, nó sẽ chỉ sao chép các tệp đang sử dụng và chỉ tạo một thùng chứa từ các tệp đó. Giảm kích thước đáng kể!


1

Tôi đã có cùng một câu hỏi chính xác và muốn một công cụ dễ sử dụng. Sau khi tìm kiếm và không tìm thấy tôi đã viết mkimg.sh . Tôi phác thảo quá trình tôi đã sử dụng tại: /raspberrypi//a/37899/32585

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.