Làm cách nào để thay đổi kích thước tệp hình ảnh trước khi ghi vào thẻ SD?


13

Tôi đã cố gắng tạo một hình ảnh Raspbian mới với một kernel khác (có hỗ trợ CAN) và với Python 3.3 được cài đặt. Thay vì thực hiện tất cả những điều này trên Raspberry Pi, tôi nghĩ rằng sẽ rất thú vị khi thực hiện nó trên máy tính (làm theo các hướng dẫn sau ). Tuy nhiên, một khi tôi đã gắn hình ảnh và sẵn sàng để đi, tôi nhanh chóng hết dung lượng đĩa. Tôi cho rằng điều này là do hình ảnh có kích thước chỉ đủ lớn với mong muốn người dùng sẽ thay đổi kích thước hệ thống tệp sau khi nó được ghi vào thẻ SD.

Có thể thay đổi kích thước hình ảnh và hệ thống tệp trước khi ghi nó vào thẻ SD để tôi có thể tùy chỉnh nhiều hơn mà không bị hết dung lượng không?


Câu hỏi này có thể sẽ giúp bạn.
Jivings

1
@Jivings: tất cả các câu trả lời này mô tả cách thay đổi kích thước hình ảnh sau khi nó được ghi vào thẻ SD. Tôi biết làm thế nào để làm điều đó; Tôi quan tâm đến cách thay đổi kích thước hình ảnh trước khi ghi nó vào thẻ SD.
DrAl

Câu trả lời:


7

Đây là cách thay đổi kích thước tệp hình ảnh thô. Tôi biết nó nghe có vẻ đơn giản ngu ngốc, nhưng nó sẽ hoạt động.

Tạo một hình ảnh trống, có kích thước bạn muốn mở rộng bản gốc (trong ví dụ của tôi, tôi sử dụng 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Nối cái này vào ảnh gốc:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Thay đổi kích thước hệ thống tập tin nằm ở cuối đĩa (thường đây là hệ thống bạn muốn lớn hơn):

resize2fs -f /path/to/rasperrypi.img

Làm xong! Đĩa của bạn bây giờ phải lớn hơn 5GB!


Nghe có vẻ hoàn hảo, cảm ơn bạn: Tôi sẽ kiểm tra tối nay.
DrAl

5
Tôi vừa thử điều này và khi tôi đến giai đoạn resize2fs (sau khi thêm 1GB vào tệp), tôi nhận được "Số ma thuật xấu trong siêu khối trong khi cố gắng mở 2012-12-16-wheezy-raspbian.img Không thể ' t tìm siêu khối hệ thống tập tin hợp lệ. " Có gợi ý nào về những gì tôi đang làm sai không?
DrAl

Đối với tôi có vẻ như đó là một vấn đề với thực tế là tôi đang cố gắng thay đổi kích thước2fs toàn bộ hình ảnh (tương đương với / dev / sda) thay vì phân vùng (tương đương với / dev / sda2). Tuy nhiên, tôi có thể sai và tôi đã thử một vài thứ khác mà không thành công (như thay đổi kích thước phân vùng bằng fdisk, có vẻ như hoạt động nhưng không giúp tôi thay đổi kích thước hệ thống tệp).
DrAl

3
Được rồi, tôi đã tìm thấy câu trả lời cho bit cuối cùng với một chút googling: Tôi cần tạo một thiết bị lặp chỉ vào phân vùng trong hình ảnh. Tôi đã làm điều này bằng cách lấy khu vực bắt đầu của phân vùng thứ hai từ fdisk -l file.imgđó (lúc đó là 122880) losetup --offset $((122880 * 512)) /dev/loop0 file.img. Sau đó tôi có thể sử dụng resize2fstrên /dev/loop0và dọn dẹp với losetup -d /dev/loop0. Nếu bạn cập nhật câu trả lời của mình để bao gồm câu trả lời này, tôi sẽ đánh dấu nó là câu trả lời được chấp nhận. Cám ơn đã chỉ tôi hướng đi đúng.
DrAl

1
@DrAl Này, tôi đã cố gắng giải pháp của bạn sử dụng resize2fstrên /dev/loop0nhưng đã tôi nhận được một hoảng loạn kernel lúc khởi động nói kích thước superblock và kích thước phân vùng không phù hợp: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksbạn đã đi qua một cái gì đó như thế này?
GuySoft

4

Đây là tổng hợp các câu trả lời ở trên và những nơi khác phù hợp với tôi - sao lưu hình ảnh của bạn trong trường hợp bạn mắc lỗi:

Trước tiên, làm cho tệp hình ảnh lớn hơn (ở đây chúng tôi sẽ thêm 1GB vào cuối):

truncate -s +1G ./image.img

Tiếp theo ánh xạ toàn bộ hình ảnh như một thiết bị lặp để chúng ta có thể chọc vào bảng phân vùng

sudo losetup /dev/loop0 ./image.img

Để tham khảo trong tương lai, hãy đổ nó:

sudo fdisk -l /dev/loop0

Đầu ra trông như:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Bây giờ chúng ta sẽ làm lại phân vùng cuối cùng bằng cách xóa nó, sau đó tạo lại nó ở cùng một vị trí bắt đầu, cùng loại nhưng vị trí kết thúc khác nhau. Vì vậy, hãy lưu ý cột "Bắt đầu" cho loop0p2 (phân vùng 2 - phân vùng Linux) - chúng ta sẽ sử dụng nó sau - 122880 của nó ở đây.

sudo fdisk /dev/loop0

Nhập các mục sau - chúng an toàn để nhập - không có gì xảy ra vĩnh viễn cho đến khi bạn đọc phần giải thích của tôi như sau:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. chỉ cần nhấn enter để chấp nhận mặc định
  9. p

Bước 1 - in bảng hiện tại. Bước 2-3 - xóa phân vùng 2, Bước 4-8 - tạo lại phân vùng 2 với điểm kết thúc mới (mặc định là kết thúc hình ảnh), Bước 9 - in ra bảng mới.

Giả sử bảng mới được in của bạn giống hệt với bảng gốc ngoại trừ giá trị Kết thúc và giá trị Khối (tức là kích thước đã thay đổi), bạn đã sẵn sàng cam kết.

Nhập wđể cam kết thay đổi của bạn, sau đó nhập qđể thoát.

Bạn có thể xóa thiết bị loopback đó, chúng tôi sẽ tạo một cái khác cho phân vùng thứ hai. Hãy nhớ phần bù bắt đầu mà bạn đã lưu ý và sử dụng ở trên - chúng tôi sẽ sử dụng lại:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Điều đó sẽ tạo ra một ánh xạ mới khi /dev/loop0chỉ vào phân vùng 2 - để tham chiếu 512 là kích thước cung cấp mà bạn có thể thấy trong đầu fdiskra đầu tiên .

Bây giờ thay đổi kích thước phân vùng để lấp đầy không gian có sẵn:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Xong - bây giờ dọn dẹp:

sudo losetup -d /dev/loop0

cảm ơn ... các hướng dẫn trên không hiệu quả với tôi nhưng điều này đã làm. Tôi đã nhận được một số cảnh báo khi viết bảng phân vùng: `` `Lệnh (m để được giúp đỡ): w Bảng phân vùng đã bị thay đổi. Gọi ioctl () để đọc lại bảng phân vùng. Đọc lại bảng phân vùng không thành công.: Đối số không hợp lệ Nhân vẫn sử dụng bảng cũ. Bảng mới sẽ được sử dụng ở lần khởi động lại tiếp theo hoặc sau khi bạn chạy partprobe (8) hoặc kpartx (8). `` `Tôi chỉ bỏ qua nó và điều đó là tốt.
StFS 18/03/2017

Thông minh! Bạn là người duy nhất đưa ra câu trả lời đúng! Cảm ơn.
yushulx

3

Đối với những người có Oracle VM VirtualBox chạy thì khá dễ dàng.

Trên máy Windows, mọi thứ diễn ra như sau:

input.imgđây là hình ảnh nên giảm kích thước và output.imglà hình ảnh cuối cùng - trong ví dụ này được xác định là lớn 7000 MB.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Mong cái này giúp được chút ít.


Cảm ơn giải pháp này, rất xảo quyệt. Đây là người duy nhất tôi có thể tìm thấy miễn phí và hoạt động hoàn hảo trên Windows. Tôi gặp một số vấn đề với thẻ 16 GB không cùng kích thước và cần thay đổi kích thước hình ảnh của tôi.
Josh

Tôi đã nhận được lỗi hoảng loạn kernel. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

Lưu ý rằng điều này đang cắt bớt hình ảnh - bạn sẽ mất dữ liệu nếu có bất kỳ dấu 7000.000 nào - các lệnh sẽ không cảnh báo hoặc khiếu nại.
Mike Redcoat

2

Đây là cách thay đổi kích thước tệp hình ảnh thô. Tôi biết nó nghe có vẻ đơn giản ngu ngốc, nhưng nó sẽ hoạt động.

Tạo một hình ảnh trống, có kích thước bạn muốn mở rộng bản gốc (trong ví dụ của tôi, tôi sử dụng 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Nối cái này vào ảnh gốc:

cat /path/to/temp_image >> /path/to/rpi.img

Tiếp theo là thay đổi kích thước phân vùng và hệ thống tập tin. Đầu tiên, lấy phần bù của phân vùng;

fdisk -l /path/to/rpi.img

Kết quả trong một bảng như thế này:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Lưu ý phần bù bắt đầu của phân vùng thứ hai

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Cuối cùng unmount / dev / loop

losetup -d /dev/loop0

Làm xong! Đĩa của bạn bây giờ phải lớn hơn 5GB!

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.