Phóng to hình ảnh hệ thống tập tin


7

Tôi đã làm dpkg --configure -atrong Debian điên cuồng của tôi. Và đã nhận được lỗi này:

dpkg --configure -a
dpkg: failed to write status record about `libcairo2' to `/var/lib/dpkg/status': No space left on device

Tôi bị chroot vào một .imgtập tin. Tôi có thể làm gì?


Bạn có ý nghĩa gì khi "chroot vào một tập tin .img"?
Stephen Kitt

1
vui lòng bao gồm đầu ra của df -hlệnh và có những gì @StephenKitt cũng đã hỏi!
Munai Das Udasin 19/07/2015

@MunaiDasUdasin Cảm ơn bạn đã phản hồi. Df -h được tôi / là 100% được sử dụng. StephenKitt Tôi có một hình ảnh mà tôi sử dụng để chroot vào. Ý tôi là, với losetup tôi đã gắn nó và chroot vào nó. Dù vậy, cảm ơn cả hai tôi đang thử câu trả lời bên dưới máy atm
JohnnyBoy 19/07/2015

Btw @JohnnyBoy có một phím tắt tiện lợi mount -oloop file /paththực hiện thao tác bit losetup cho bạn.
sourcejedi

Câu trả lời:


3

Để làm điều này một cách chính xác, bạn cần phải:

  1. Đầu tiên mở rộng .imgtập tin.
  2. Tiếp theo mở rộng hệ thống tập tin trong.

Cách tốt nhất để làm điều đầu tiên là với dd. Vì lý do nào đó, một số người gán một loại bí ẩn cho cách ddlàm việc, nhưng thực sự không có. Ví dụ: để thêm một lỗ vào cuối .imgtệp của bạn :

dd bs=1kx1k seek=100 of=.img </dev/null

Trên bất kỳ hệ thống POSIX nào sẽ cắt tệp thành 100MiBs. Trên hệ thống GNU, 1kx1kbit có thể được rút ngắn thành chỉ M. ddtìm kiếm 100MiBs vào tệp, gặp EOF trong lần đọc đầu tiên và đóng tệp. Đó là một hành động duy nhất và không yêu cầu đọc (ngoài lần trống đầu tiên) hoặc viết - nó gần như nguyên tử.

Nếu tệp là 50MiB trước đó, thì bây giờ nó sẽ được phân bổ thêm 50MiB. Nếu tập tin là 150MiB trước đó, điều đó sẽ cắt 50MiB cuối cùng ra khỏi đuôi. Trên một hệ thống tệp hiểu các tệp thưa thớt , lỗ tệp được nối sẽ thực sự không sử dụng không gian đĩa, và sẽ chỉ sử dụng những gì cần thiết khi bạn điền vào.

Các cách khác để làm tương tự trên một số hệ thống:

fallocate -l100M .img
truncate -s100M .img

... cả hai lệnh này sẽ thực hiện chính xác điều tương tự dd. Tôi khuyên bạn ddvì không có công cụ nào trong số đó là di động trong đó ddhành vi của POSIX-spec'd và khi bạn tìm hiểu cách sử dụng trình hủy đĩa đúng cách, sẽ không có đĩa nào dám cản đường bạn.

Nếu bạn chỉ đơn thuần thêm vào, .imgbạn có thể thực hiện những điều trên cho dù nó có được gắn hay không (mặc dù nếu bạn lấy một số gắn kết .imgthì nó có thể không hoạt động như mong đợi) , nhưng trước tiên bạn sẽ cần phải umount.imgthay đổi kích thước của nó hệ thống tập tin cấu thành nào, và vì vậy cũng có thể. Bạn không cần phải -destroy thiết bị vòng lặp, mặc dù.

Cách bạn xử lý điều thứ hai phụ thuộc vào việc có .imgđược phân vùng hay không. Nếu không, như tôi đoán là trường hợp dựa trên nhận xét của bạn ở nơi khác, thì bạn sẽ chỉ cần giải quyết fs theo loại của nó. Đối với một ext[234] .imgtập tin bạn nên sử dụng resize2fsvà được thực hiện với nó. Đối với những người khác, bạn sẽ muốn xem các công cụ không gian người dùng có liên quan và các mantrang của họ .

Nếu .imgđược phân vùng nó có thể phức tạp hơn. Trong các trường hợp như vậy, cách bạn xử lý tình huống sẽ phụ thuộc vào loại bảng phân vùng được sử dụng (chẳng hạn như GPT vs MBR so với hybrid-MBR) , cho dù đó là phân vùng cuối cùng trong bảng phân vùng của tệp và nhiều thứ khác. Tôi ngần ngại mạo hiểm bất kỳ chi tiết cụ thể nào ở đây mà không có thêm thông tin: nếu bạn cần tư vấn về cách xử lý phân vùng, .imgvui lòng cho tôi biết thêm một số chi tiết và tôi sẽ cung cấp những gì tôi có thể.


Cảm ơn rất nhiều. Tuy nhiên dd bs = 1M đếm = 500 >> .img cũng hoạt động. Chỉ cần nói. Câu trả lời tuyệt vời
JohnnyBoy 20/07/2015

@Johnnyboy - Ok ... nhưng đầu vào ở đó là gì?
mikeerv 20/07/2015

@JohnnyBoy - và dù sao đi nữa, trong khi nó sẽ hoạt động, bạn thực sự sẽ phải sao chép một cái gì đó trong trường hợp đó. Điều đó có nghĩa là bạn cần tới 500 lần đọc / ghi. Nếu bạn chỉ seek, tuy nhiên, bạn chỉ cần làm 1.
mikeserv

Cả hai đều hữu ích. Các seek/ truncatephương pháp tạo ra một "tập tin thưa thớt", nơi không gian không được phân bổ cho đến khi nội dung được ghi vào nó. Kết quả có thể trở nên phân mảnh hơn trên đĩa.
sourcejedi

1
@sourcejedi - nó cũng vui seq 20 >nums; seq 20 | (</dev/null dd bs=20 seek=1; cat) 1<>nums; cat nums- thử nó. Bạn có thể đạt được mục đích tương tự <>như bạn có thể với conv=notrunc. Một số ddthứ khác : ddbộ đệm vòngphân vùng ẩn .
mikeerv 20/07/2015

5

Nếu hệ thống tập tin chroot đã đầy, bạn có thể phóng to tệp hình ảnh.

Ví dụ như sử dụng dd conv=notrunc oflag=append bs=1M count=X of=file.img. Hãy rất, rất cẩn thận :). Tức là nếu sau đó bạn có thể ngắt kết nối chroot và sao lưu tệp .img, vì điều đó sẽ rất được khuyến khích.

Sau đó thay đổi kích thước hệ thống tập tin, để nó có thể sử dụng thêm không gian. Đối với một hệ thống tập tin ext4, lệnh sẽ là resize2fs. Trang này gợi ý bạn sẽ phải chạy lệnh cuối cùng đó trên thiết bị lặp chứ không phải tệp:

# losetup -f file.img
# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /home/alan/file.img
# resize2fs /dev/loop0
...
# losetup -d /dev/loop0

Lệnh sẽ khác nhau đối với các hệ thống tệp khác nhau, ví dụ: btrfs filesystem resize /dev/loop0 maxhoặc xfs_growfs /test.img/is/mounted/here.


Này cảm ơn vì câu trả lời. Tôi nhận được "nối thêm chuyển đổi không hợp lệ" sau lệnh dd và tôi thay đổi kích thước2fs nói rằng "hệ thống tập tin đã dài 183105 (4k) byte. Không có gì để làm!"
JohnnyBoy

@JohnnyBoy Đừng bận tâm dd, nó khó sử dụng và khó sử dụng hơn. Chỉ cần sử dụng một cái gì đó như truncate -s 10G foo.imgtrong đó 10G là kích thước mới mà bạn muốn cho hình ảnh (lớn hơn kích thước hiện tại!). Làm điều đó với hình ảnh chưa từng có. Sau đó thay đổi kích thước hệ thống tập tin.
Gilles 'SO- ngừng trở nên xấu xa'

Xin lỗi, đã sửa. truncatehoạt động quá, và có một sự khác biệt trong kết quả có thể thực hiện được (nhận xét về câu trả lời khác).
sourcejedi
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.