hệ thống tập tin gốc btrfs trên raspbian


11

Tôi nghĩ rằng tôi có thể trải nghiệm với btrfs như phân vùng gốc để xem cách nó xử lý tham nhũng tệp trong khi cắt điện. Nhưng tôi không thể khởi động nó.

Tôi đã làm gì:

  1. trên PI trước khi chuyển đổi:

    apt-get install btrfs-tools 2. Từ máy tính linux:

    btrfs-convert / dev / sda2

  2. Trong /etc/fstabsự thay đổi ext4đểbtrfs

  3. Trong /cmdline.txtsự thay đổi ext4đểbtrfs

Tôi nhận được một hoảng loạn kernel nếu tôi thử làm boot. Tôi có nên làm gì khác không?

Câu trả lời:


7

Nếu btrfs được biên dịch dưới dạng mô-đun hạt nhân, thì bạn cần tạo initramfs để tải mô-đun khi khởi động. Trên Raspian (và các dẫn xuất debian khác), update-initramfslà phương pháp dễ nhất để làm điều này.

Nếu initramfs-toolsđược cài đặt, thì bất cứ khi nào apt-getcài đặt kernel mới, nó sẽ update-initramfstự động kích hoạt .

sudo apt-get update
sudo apt-get install initramfs-tools

Tuy nhiên, nếu bạn sử dụng rpi-updateđể cài đặt kernel mới, thì bạn sẽ cần chạy update-initramfsthủ công trước khi khởi động lại vào kernel mới:

sudo update-initramfs -u -k <kernel-version>

Điều này sẽ tạo hoặc cập nhật các initramfs trong /boot/initrd.img-<kernel-version>.

Bước cuối cùng là thêm nó vào cấu hình khởi động của bạn: thêm dòng sau vào /boot/config.txt:

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>phải khớp chính xác tên của tệp trong /boot.

Bạn sẽ cần phải lặp lại các bước này mỗi khi bạn chạy rpi-update.


2

Thử nghiệm nhanh của tôi cho thấy rằng hỗ trợ btrfs được xây dựng dưới dạng một mô-đun bên ngoài bằng raspbian, không được liên kết trực tiếp vào kernel.

Điều đó có nghĩa là kernel phải có khả năng tải mô-đun đó (được lưu trữ trên hệ thống tệp gốc) trước khi nó biết cách gắn kết hệ thống tệp gốc. Rõ ràng, điều này không làm việc.

Cách tiếp cận 1:

Xây dựng kernel của riêng bạn và điều chỉnh cấu hình của nó thành btrfs liên kết trước. Tinh chỉnh cấu hình thật dễ dàng nếu bạn đã tìm ra cách xây dựng và tải kernel của riêng mình.

Cách tiếp cận 2:

Điều chỉnh lại mọi thứ để kernel và mô-đun nằm trong hệ thống tập tin ext4 và dữ liệu bạn muốn nén nhất nằm trên phân vùng btrfs.

Cách tiếp cận 2A:

Để lại phân vùng gốc là ext4 và tạo một phân vùng mới dựa trên btrfs, nhưng điều đó không giúp thu hẹp cài đặt hệ điều hành (nếu đó là mục tiêu của bạn).

Cách tiếp cận 2B:

Tạo một phân vùng khởi động nhỏ, và giữ kernel và các mô-đun, trong khi để lại mọi thứ khác trên btrfs. Tôi không biết làm thế nào để làm điều này cho bộ tải khởi động của Pi, hoặc những hạn chế xung quanh vấn đề này.


Điều gì về việc sao chép các mô-đun btrfs vào phân vùng khởi động và tải chúng từ đó trước?
GuySoft

3
Không phải cũng có thể bắt đầu với initrd.img sao?
Anders

Vâng, và initrd.img có vẻ như là cách dễ nhất để giải quyết nó! Tôi chưa bao giờ sử dụng nó. Tìm tài liệu về "mkinitrd".
DonGar

Hmm có vẻ như CONFIG_BLK_DEV_INITRD không được bật trong Raspbian mới nhất. Điều này có nghĩa là bạn cần biên dịch lại kernel để kích hoạt hỗ trợ initd.
GuySoft

1
Xem paxswill.com/blog/2013/11/04/encrypted-raspberry-pi - Có initramfs được sử dụng để cho phép root được mã hóa. Tương tự, hỗ trợ cho cryptsetup (ở đây btrfs) là cần thiết trước khi root có sẵn.
Rbjz

1

Để có được nó để tìm phân vùng gốc BTRFS bên ngoài của tôi, tôi cần chỉ định rõ ràng UUID của phân vùng gốc trong phân vùng khởi động cmdline.txt. Ví dụ:

dwc_otg.lpm_enable = 0 console = tty1 root = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype = btrfs thang máy = thời hạn chờ đợi

Bạn có thể xác định UUID của phân vùng BTRFS bằng cách sử dụng lsblk -f.


1

Hạt nhân Raspbian không bao gồm hỗ trợ btrfstheo mặc định; các giai đoạn khởi động ban đầu chạy bình thường, nhưng khi kernel tải, nó sẽ không thấy bất kỳ hệ thống tập tin nào có thể gắn kết - và hoảng loạn. Một giải pháp tồn tại: thêm btrfs như một mô-đun hạt nhân, trong initramfs. Phần lớn nhờ vào ba bài viết khác nhau , tôi đã thiết lập nó như vậy:

  • Cài đặt các gói cần thiết - mô-đun hạt nhân và các công cụ để cập nhật initramfs với nó: sudo apt install btrfs-tools initramfs-tools
  • Yêu cầu initramfs tải mô-đun btrfs (vì lý do nào đó sẽ xảy ra tự động, vì một số lý do, không hoạt động trên RPi1 của tôi) - nối một dòng có "btrfs" vào danh sách các mô-đun cần thiết: echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • Tạo một hook initramfs (để xây dựng hình ảnh) và script (để khởi động) cho btrfs - mặc định được cung cấp, nhưng trong thử nghiệm của tôi, chúng không được sử dụng tự động, phải sao chép chúng vào / etc. sudo mkdir -p /etc/initramfs-tools/hooks ; sudo mkdir -p /etc/initramfs-tools/scripts/local-premount ; sudo cp /usr/share/initramfs-tools/hooks/btrfs /etc/initramfs-tools/hooks ; sudo cp /usr/share/initramfs-tools/scripts/local-premount/btrfs /etc/initramfs-tools/scripts/local-premount; sudo chmod +x /etc/initramfs-tools/hooks/btrfs /etc/initramfs-tools/scripts/local-premount/btrfs
  • Tạo ( -c) initramfs mới cho phiên bản kernel hiện tại (uname -r) - nếu bạn đang cập nhật một cái hiện có, -uthay vào đó , bạn sẽ cần sử dụng update ( ). Điều này sẽ tạo một tệp có tên như /boot/initrd.img-*, trong đó * là phiên bản kernel hiện tại. Lưu ý tên được tạo (tập lệnh sẽ xuất nó), chúng tôi sẽ sử dụng nó trong bước tiếp theo.update-initramfs -c -k $(uname -r)
  • Chỉnh sửa /boot/config.txtđể sử dụng initramfs này, thêm initramfs initrd.img-3.11.0+ followkernelTên tệp không có đường dẫn, đây là tên được tạo ở bước trước; "followkernel" kiểm soát vị trí trong bộ nhớ ( tài liệu config.txt ).
  • Điều đó giải quyết kernel hiện tại, nhưng như @Ingo đã chỉ ra, việc nâng cấp kernel sẽ phá vỡ hệ thống. Để khắc phục điều này, tôi đã sử dụng tập lệnh hook cài đặt kernel :

    • Chỉnh sửa / etc / default / raspberrypi-kernel và uncomment INITRD=Yes
    • xóa bỏ /etc/kernel/postinst.d/initramfs-tools
    • thêm rpi-initramfs-tools vào /etc/kernel/postinst.d/ và chmod +x
    • tùy chọn, tải xuống update-rpi-initramfs để cập nhật thủ công đơn giản hơn các initramfs.
  • Tại thời điểm này, chúng tôi có một hệ thống có thể sử dụng btrfs làm thiết bị gốc. Kiểm tra bằng cách khởi động lại: hệ thống vẫn sẽ khởi động từ phân vùng ext4 (hoặc bất cứ thứ gì có trong /boot/cmdline.txt của bạn ), nhưng dmesg | grep -i btrfsbây giờ sẽ hiển thị một dòng có chứa "Btrfs được tải". Bây giờ chúng ta cần thực sự tạo và sử dụng phân vùng btrfs.

  • Tạo một bản sao lưu của /phân vùng (ext4) - giả sử đây là / dev / mmcblk0p2 - thông thường: tắt RPi, rút ​​thẻ SD, gắn nó vào một nơi khác (trong ví dụ này sudo mount /dev/mmcblk0p2 /mnttrên máy tính Linux) và lưu trữ nội dung; lưu ý rằng bạn cần sử dụng một công cụ bảo vệ quyền sở hữu và quyền, ví dụ: tar: cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *(và sau đó ngắt kết nối thẻ SD một lần nữa)

  • Tạo phân vùng btrfs ở đâu đó - Tôi đã sử dụng lại thẻ SD, thay thế phân vùng ext4 (/ dev / mmcblk0p2); nếu bạn đang tìm cách tạo một mảng btrfs-raid, đây là lúc để thực hiện điều này ( đây là một trong những đối số cho mkfs.btrfs , ngoài phạm vi của câu trả lời này):mkfs.btrfs /dev/mmcblk0p2
  • Gắn kết phân vùng btrfs và khôi phục bản sao lưu vào nó: sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
  • Chỉnh sửa fstab trên phân vùng btrfs :sudo nano /mnt/etc/fstab

Cần có một hàng tương tự như thế này:

/dev/mmcblk0p2  / ext4 foo,bar,baz 0 1

Thay đổi nó thành cái này (loại FS mới là btrfs và nó sử dụng các tùy chọn mặc định):

/dev/mmcblk0p2  / btrfs defaults 0 1
  • Ngắt kết nối phân vùng, nhưng chưa tháo thẻ SD! sudo umount /mnt
  • Chúng ta cần nói với RPi rằng nó sẽ khởi động từ btrfs
  • Tìm UUID của phân vùng btrfs mới của bạn - tìm dòng có / dev / mmcblk0p2 và sao chép phần UUID =, với (không phải UUID_SUB, không phải PHẦNUUID! Điều đó sẽ gây ra lỗi trong bộ tải khởi động và kernel sẽ không khởi động được .):sudo blkid

    / dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUU

  • Gắn kết phân vùng khởi động (FAT32): sudo mount /dev/mmcblk0p1 /mnt

  • Chỉnh sửa cmdline.txt: sudo nano /mnt/cmdline.txt

Tìm hai tham số này

 root=PARTUUID=1234-5678 rootfstype=ext4

Và thay thế bằng

 root=UUID=cafebeef-0000-1234-aaaa-12346589 rootfstype=btrfs

Lưu ý rằng UUID là UUID chúng tôi đã sao chép trước đó, chỉ không có dấu ngoặc kép.

  • Ngắt kết nối phân vùng khởi động RPi: sudo umount /mnt
  • Thay thế thẻ SD thành RPi và khởi động.
  • Trên RPi, hãy xem rằng bạn thực sự đang chạy từ một root root btrfs: mount

    / dev / mmcblk0p2 trên / loại btrfs (rw, space_cache, subvol = /)

  • Et voilà! Không hoàn toàn là điểm nhấn, nhưng bằng cách đứng trên vai những người khổng lồ, tôi có thể làm cho nó hoạt động. (Làm điều này thành một repo , quá.)


1
Với lần đầu tiên sudo apt upgradenếu nó cũng nâng cấp kernel, thiết lập này sẽ thất bại đáng kể khi khởi động vì kernel mới cố tải các initramfs cũ sẽ bị lỗi và kernel không thể tải trình điều khiển btrfs. Và nó không phải là một cách dễ dàng để sửa nó, ít nhất là với một chroothệ thống armhf.
Ingo

Sẽ không cập nhật initramfs được nâng cấp khi nâng cấp kernel?
Piskvor rời khỏi tòa nhà

1
Không, Raspbian mặc định không tạo được initramfs mới. Nó không được cấu hình cho việc này. Bạn luôn phải theo dõi bằng mắt những gì apt upgradeđang làm và phải tạo ra một initramfs bằng tay nếu được yêu cầu - trước khi khởi động kernel mới. Không phải là một nhiệm vụ có thể làm cho một người mới bắt đầu bởi vì thất bại nó là kịch tính. Bạn có thể xem Làm thế nào tôi có thể sử dụng init ramdisk (initramfs) khi khởi động Raspberry Pi?
Ingo

1
Nó có một lỗi nhỏ tôi vừa tìm thấy nhưng chưa được sửa. Nhân hỗ trợ hai mô hình, ví dụ 4.14.98+4.14.98-v7+. Nếu update-initramfs được kích hoạt bởi một bản cập nhật kernel, nó sẽ tạo ra hai initrd.img *, một cho mỗi mô hình. Điều này không phù hợp với /bootphân vùng (lỗi - hết dung lượng) và việc tạo không kết thúc.
Ingo

1
Tôi cân nhắc sử dụng MODULES=list.
Ingo
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.