Có thể thu nhỏ trực tuyến âm lượng EXT4 với LVM không?


47

Hôm nay tôi đã thử điều này trên máy của mình với OpenSUSE 12.3 (kernel 3.7):

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Sep-2012)
Filesystem at /dev/mapper/system-srv is mounted on /srv; on-line resizing required
resize2fs: On-line shrinking not supported

/dev/mapper/system-srv là một khối lượng EXT4.

Có thực sự không được hỗ trợ hoặc tôi đang thiếu một cái gì đó?

Câu trả lời:


68

Như thông báo đã nói, bạn chỉ có thể phát triển một hệ thống tập tin trực tuyến. Nếu bạn muốn thu nhỏ nó, bạn sẽ cần ngắt kết nối nó trước.

Theo người duy trì hệ thống tập tin ext4 , Ted Ts'o:

Xin lỗi, thu hẹp trực tuyến không được hỗ trợ.


12
Thật đáng tiếc ...
Alicia

5
Điều gì với downvote?
Michael Hampton

16
@MichaelHampton - Một số moron bắn tin nhắn? : D
tink

2
Đó là 10 năm trước. Điều này đã được thực hiện chưa?
duane

@duane Không. Nó không có. Nó cũng không phải là như vậy.
Michael Hampton

17

Có, bạn có thể thu nhỏ / di chuyển / phát triển phân vùng gốc mà không cần khởi động lại (cũng không phải livecd, cũng không phải usbkey): tham khảo câu trả lời này . Nó được viết rất tốt và dễ theo dõi, mặc dù khá dài và hơi mạo hiểm.

resize2fs không thể thu nhỏ ext4phân vùng trực tuyến . Hạn chế này, khi được áp dụng trên phân vùng gốc có thể khiến bạn nghĩ rằng bạn không thể tránh khởi động lại máy chủ để cho phép thu nhỏ rootphân vùng, đây có thể là điều bạn muốn tránh. Quá trình được liên kết sẽ cho phép bạn vượt qua phân vùng gốc mà không cần khởi động lại. Vì vậy, trong trường hợp này, việc nói thay đổi kích thước trực tuyến không liên quan đến trạng thái gắn kết của phân vùng, tuy nhiên nó vẫn thay đổi kích thước trực tuyến liên quan đến trạng thái trực tuyến của mạng hoặc khả năng tiếp cận của máy chủ.

Tất nhiên, nếu bạn chỉ muốn phát triển phân vùng ext4 của mình, bạn nên bám vào các resize2fsgiải pháp làm việc thông thường .

Ví dụ, giải pháp chung mà tôi đã liên kết sẽ hoạt động trên mọi loại giải pháp dành riêng hoặc VPS.

TLDR; giải pháp này ngụ ý đến pivot_rootđể tmpfs, do đó bạn có thể umountan toàn phân vùng gốc của bạn sống và fiddle với nó. Sau khi hoàn thành, bạn sẽ pivot_rootquay lại phân vùng gốc mới.

Điều này cho phép khá nhiều thao tác trên hệ thống tệp gốc (di chuyển nó, thay đổi hệ thống tệp, thay đổi thiết bị vật lý của nó ...).

Cá nhân tôi đã sử dụng cái này và nó cũng hoạt động rất tốt trên hệ thống debian, nhưng hướng dẫn ban đầu được viết vào năm 2007 để làm lại, câu trả lời tôi đã liên kết đã được cập nhật cho CentOS7. Rất có khả năng nó sẽ hoạt động trên OpenSUSE của bạn, mặc dù có thể với một số điều chỉnh.


4
Đây không phải là 'trực tuyến' liên quan đến so sánh với 'phát triển trực tuyến'. Tất cả các dịch vụ phải ngừng hoạt động và hệ thống tập tin gốc của bạn không thể truy cập được. Có thể đáng để đối chiếu điều này với cách tiếp cận livecd hoặc initramfs / rdshell trong bình luận này. Tôi ghét mọi người bị nhầm lẫn bởi điều này.
Brian Chrisman

2
@BrianChrisman Đây thực sự là một gotcha có công làm rõ và tôi hy vọng tôi đã bao gồm một chỉnh sửa trong bài viết của mình. Rất cám ơn đã phản hồi.
vaab

Điều tôi thích về giải pháp được tham chiếu là nó 'gần như trực tuyến'. Tôi đã làm điều đặc biệt này bằng cách mã hóa một tập lệnh và công cụ nhỏ vào lệnh dracut và khởi chạy các initramfs kết quả từ kexec. Nếu điều này bằng cách nào đó có thể giữ một phiên ssh mở trong suốt quá trình, đó sẽ là tốt nhất. Tôi cho rằng nếu bạn xây dựng root giả với sshd và các tệp cần thiết, hãy khởi động một sshd khác (vì bạn đã ssh'd) trên một cổng khác, sau đó bạn có thể ssh sang cổng khác và xác minh kết nối trước khi tiếp tục lobotomize hệ thống.
Brian Chrisman

13

Nếu trường hợp là máy chủ từ xa không có bàn điều khiển, bạn có thể thu nhỏ hệ thống tập tin bằng cách sử dụng initramfs trong khi khởi động lại. Bạn cần thêm resize2fs vào initramfs và chạy nó trước khi gắn root.

Ví dụ về Debian / Ubuntu:

/ etc / initramfs-tools / hook / resizefs (thực thi):

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case $1 in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs

exit 0

/ etc / initramfs-tools / scripts / local-Premount / resizefs (thực thi)

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G
/sbin/e2fsck -yf /dev/sda1

Bây giờ hãy chạy update-initramfs, khởi động lại, kiểm tra kích thước, xóa các tập lệnh này và cập nhật lại intiramfs.

Đối với dracut (Fedora, CentOS) sử dụng cùng logic (/usr/lib/dracut/modules.d).

Điều này rất hữu ích cho việc mã hóa hoặc di chuyển rootfs, không có không gian trống cho phân vùng mới.


2
Công việc này như một cái duyên vậy. Lưu ý rằng bạn cần chạy update-initramfs với tùy chọn -u.
Diomidis Spinellis

Mát mẻ. Trong trường hợp của tôi, tôi cũng cần update-grub.
Wojciech Kaczmarek
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.