ระบบไฟล์รูท btrfs บน raspbian


11

ฉันคิดว่าฉันอาจมีปัญหากับ btrfs ในฐานะพาร์ติชันรูทเพื่อดูวิธีจัดการกับความเสียหายของไฟล์ระหว่างการตัดไฟ แต่ฉันไม่สามารถบูตได้

ฉันทำอะไรลงไป:

  1. บน PI ก่อนที่จะเปลี่ยน:

    apt-get install btrfs-tools 2. จากคอมพิวเตอร์ linux:

    btrfs- แปลง / dev / sda2

  2. ใน/etc/fstabการเปลี่ยนext4ไปbtrfs

  3. ใน/cmdline.txtการเปลี่ยนext4ไปbtrfs

ฉันได้รับเคอร์เนลที่น่าตกใจถ้าฉันลองบูท ฉันควรจะทำอะไรอีกหรือไม่

คำตอบ:


7

หากคอมไพล์ btrfs เป็นโมดูลเคอร์เนลคุณต้องสร้าง initramfs เพื่อโหลดโมดูลตอนบูต บน Raspian (และตราสารอนุพันธ์อื่น ๆ เดเบียน) update-initramfsเป็นวิธีที่ง่ายที่สุดในการทำเช่นนี้

หากinitramfs-toolsมีการติดตั้งแล้วเมื่อใดก็ตามที่apt-getติดตั้งเคอร์เนลใหม่ก็จะเรียกupdate-initramfsโดยอัตโนมัติ

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

อย่างไรก็ตามหากคุณใช้rpi-updateเพื่อติดตั้งเคอร์เนลใหม่คุณจะต้องเรียกใช้update-initramfsด้วยตนเองก่อนที่จะทำการรีบูทเคอร์เนลใหม่:

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

นี้จะสร้างหรือปรับปรุง initramfs /boot/initrd.img-<kernel-version>ใน

ขั้นตอนสุดท้ายคือการเพิ่มลงใน config boot ของคุณ: เพิ่มบรรทัดต่อไปนี้ใน/boot/config.txt:

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>/bootต้องตรงกับชื่อของไฟล์ใน

rpi-updateคุณจะต้องทำตามขั้นตอนเหล่านี้ทุกครั้งที่คุณเรียก


2

การทดสอบอย่างรวดเร็วของฉันแสดงให้เห็นว่าการสนับสนุน btrfs ถูกสร้างขึ้นเป็นโมดูลภายนอกใน raspbian ไม่ได้เชื่อมโยงโดยตรงกับเคอร์เนล

นั่นหมายความว่าเคอร์เนลจะต้องสามารถโหลดโมดูลนั้น (ซึ่งจัดเก็บไว้ในระบบไฟล์รูท) ก่อนที่จะรู้วิธีเมานต์ระบบไฟล์รูท เห็นได้ชัดว่านี่ใช้งานไม่ได้

วิธีที่ 1:

สร้างเคอร์เนลของคุณเองและปรับแต่งมันสร้างการกำหนดค่าเพื่อ pre-link btrfs การปรับแต่ง tweaking นั้นง่ายถ้าคุณรู้วิธีสร้างและโหลดเคอร์เนลของคุณเอง

วิธีที่ 2:

ปรับใหม่เพื่อให้เคอร์เนลและโมดูลอยู่ในระบบไฟล์ ext4 และข้อมูลที่คุณต้องการบีบอัดมากที่สุดคือพาร์ติชั่น btrfs

วิธีการ 2A:

ปล่อยให้รูทพาร์ติชันเป็น ext4 และสร้างพาร์ติชั่นใหม่ที่ใช้ btrfs แต่ไม่ช่วยลดการติดตั้งระบบปฏิบัติการ (ถ้าเป็นเป้าหมายของคุณ)

วิธีการ 2B:

สร้างพาร์ติชันสำหรับเริ่มระบบที่มีขนาดเล็กและเก็บเคอร์เนลและโมดูลในขณะที่เก็บทุกอย่างไว้บน btrfs ฉันไม่รู้ว่าจะทำอย่างไรกับ bootloader ของ Pi หรือข้อ จำกัด อยู่ที่นี่


สิ่งที่เกี่ยวกับการคัดลอกโมดูล btrfs ไปยังพาร์ติชันสำหรับบูตและโหลดจากที่นั่นล่วงหน้า?
GuySoft

3
เป็นไปได้ไหมที่จะเริ่มต้นด้วย initrd.img
Anders

ใช่และ initrd.img ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดในการแก้ไข! ฉันไม่เคยใช้มัน มองหาเอกสารเกี่ยวกับ "mkinitrd"
DonGar

Hmm ดูเหมือนว่า CONFIG_BLK_DEV_INITRD ไม่ได้เปิดใช้งานใน Raspbian ล่าสุด ซึ่งหมายความว่าคุณต้องคอมไพล์เคอร์เนลอีกครั้งเพื่อเปิดใช้งานการสนับสนุน initd
GuySoft

1
ดูที่paxswill.com/blog/2013/11/04/encrypted-raspberry-pi - มี initramfs ใช้เพื่ออนุญาตให้รูทที่เข้ารหัส ในทำนองเดียวกันการรองรับ cryptsetup (นี่คือ btrfs) เป็นสิ่งจำเป็นก่อนที่รูตจะพร้อมใช้งาน
Rbjz

1

เพื่อให้พบพาร์ติชันรูท BTRFS ภายนอกของฉันได้ฉันต้องระบุUUIDของรูทพาร์ติชันอย่างชัดเจนในบูตพาร์ติcmdline.txtชั่น ตัวอย่างเช่น:

dwc_otg.lpm_enable = 0 console = tty1 root = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype =ลิฟท์btrfs = กำหนดเวลารอสาดที่เงียบสงบ

คุณสามารถกำหนดพาร์ทิชัน BTRFS ของ UUID lsblk -fใช้


1

เคอร์เนล Raspbian ไม่มีการสนับสนุนbtrfsตามค่าเริ่มต้น ขั้นตอนการบู๊ตเริ่มต้นจะทำงานตามปกติ แต่เมื่อเคอร์เนลทำการโหลดมันจะไม่เห็นระบบไฟล์ใด ๆ ที่มันสามารถเมานท์ - และตื่นตระหนก มีวิธีแก้ไขปัญหา: เพิ่ม btrfs เป็นโมดูลเคอร์เนลใน initramfs ขอบคุณมากสำหรับบทความที่แตกต่างกันสาม รายการฉันได้ตั้งค่าดังนี้:

  • ติดตั้งแพ็คเกจที่ต้องการ - โมดูลเคอร์เนลและเครื่องมือในการอัปเดต initramfs ด้วย: sudo apt install btrfs-tools initramfs-tools
  • บอกให้ initramfs โหลดโมดูล btrfs (ควรเกิดขึ้นโดยอัตโนมัติด้วยเหตุผลบางอย่างไม่ทำงานกับ RPi1 ของฉัน) - ต่อท้ายบรรทัดด้วย "btrfs" ในรายการโมดูลที่ต้องการ: echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • สร้างตะขอ initramfs (สำหรับการสร้างภาพ) และสคริปต์ (สำหรับการบูท) สำหรับ btrfs - มีการกำหนดค่าเริ่มต้นไว้ แต่ในการทดสอบของฉันพวกเขาไม่ได้ใช้โดยอัตโนมัติต้องคัดลอกลงใน / 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
  • สร้าง ( -c) initramfs ใหม่สำหรับเคอร์เนลเวอร์ชันปัจจุบัน (uname -r) - หากคุณกำลังอัปเดตที่มีอยู่คุณจะต้องใช้การอัปเดต ( -u) แทน สิ่งนี้จะสร้างไฟล์ชื่อ /boot/initrd.img-* โดยที่ * คือเคอร์เนลเวอร์ชันปัจจุบัน โปรดทราบชื่อที่สร้าง (สคริปต์จะแสดงผล) เราจะใช้ในขั้นตอนต่อไปupdate-initramfs -c -k $(uname -r)
  • แก้ไข/boot/config.txtเพื่อใช้ initramfs นี้เพิ่มinitramfs initrd.img-3.11.0+ followkernelชื่อไฟล์ที่ไม่มีเส้นทางมันเป็นคนที่สร้างขึ้นในขั้นตอนก่อนหน้า; "followkernel" ควบคุมตำแหน่งในหน่วยความจำ ( เอกสารคู่มือconfig.txt )
  • สิ่งนี้แก้เคอร์เนลปัจจุบัน แต่เมื่อ @Ingo ชี้ให้เห็นการอัพเกรดเคอร์เนลจะทำให้ระบบแตก ในการแก้ไขปัญหานี้ฉันใช้สคริปต์ของ hook ที่ติดตั้งเคอร์เนล:

    • แก้ไข / etc / default / raspberrypi-kernel และไม่แสดงข้อคิดเห็น INITRD=Yes
    • ลบ /etc/kernel/postinst.d/initramfs-tools
    • เพิ่มRPI-initramfs เครื่องมือเพื่อ /etc/kernel/postinst.d/ และchmod +xมัน
    • เป็นทางเลือกให้ดาวน์โหลด update-rpi-initramfs สำหรับการอัปเดตด้วยตนเองที่ง่ายกว่าของ initramfs
  • ณ จุดนี้เรามีระบบที่สามารถใช้ btrfs เป็นอุปกรณ์รูท ทดสอบโดยการเริ่มระบบใหม่: ระบบจะยังคงบูตจากพาร์ติชัน ext4 (หรืออะไรก็ตามที่อยู่ใน/boot/cmdline.txtของคุณ) แต่dmesg | grep -i btrfsตอนนี้ควรแสดงบรรทัดที่มี "Btrfs ที่โหลด" ตอนนี้เราต้องสร้างและใช้พาร์ติชัน btrfs จริง ๆ

  • ทำสำเนาสำรองของ/พาร์ติชั่น (ext4) - โดยสมมติว่านี่คือ / dev / mmcblk0p2 - โดยทั่วไป: ปิด RPi, นำการ์ด SD ออก, ติดตั้งที่อื่น (ในตัวอย่างนี้sudo mount /dev/mmcblk0p2 /mntบนคอมพิวเตอร์ Linux) และเก็บเนื้อหา โปรดทราบว่าคุณต้องใช้เครื่องมือที่รักษาความเป็นเจ้าของและสิทธิ์เช่น tar: cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *(จากนั้นยกเลิกการต่อเชื่อมการ์ด SD อีกครั้ง)

  • สร้างพาร์ทิชัน btrfs ที่ไหนสักแห่ง - ฉันได้ใช้การ์ด SD อีกครั้งเปลี่ยนพาร์ติชัน ext4 (/ dev / mmcblk0p2); หากคุณต้องการสร้างอาร์เรย์ btrfs-raid นี่เป็นเวลาที่จะทำเช่นนี้ ( เป็นหนึ่งในอาร์กิวเมนต์ของ mkfs.btrfsซึ่งเกินขอบเขตของคำตอบนี้):mkfs.btrfs /dev/mmcblk0p2
  • เมาท์พาร์ติชัน btrfs และเรียกคืนการสำรองข้อมูลลงใน: sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
  • แก้ไข fstab บนพาร์ติชัน btrfs :sudo nano /mnt/etc/fstab

ควรมีแถวที่คล้ายกับสิ่งนี้:

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

เปลี่ยนเป็น (ประเภท FS ใหม่คือ btrfs และใช้ตัวเลือกเริ่มต้น):

/dev/mmcblk0p2  / btrfs defaults 0 1
  • ถอนติดตั้งพาร์ติชัน แต่อย่าถอดการ์ด SD ออก! sudo umount /mnt
  • เราต้องบอก RPi ว่ามันกำลังจะบูทจาก btrfs
  • ค้นหา UUID ของพาร์ติชัน btrfs ใหม่ของคุณ - ค้นหาบรรทัดด้วย / dev / mmcblk0p2 และคัดลอกส่วน UUID = ด้วย ((ไม่ใช่ UUID_SUB ไม่ใช่ PARTUUID!) ซึ่งจะทำให้เกิดข้อบกพร่องใน bootloader และเคอร์เนลจะไม่สามารถบูตได้ .)sudo blkid

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

  • เมานต์พาร์ติชันสำหรับเริ่มระบบ (FAT32): sudo mount /dev/mmcblk0p1 /mnt

  • แก้ไข cmdline.txt: sudo nano /mnt/cmdline.txt

ค้นหาพารามิเตอร์ทั้งสองนี้

 root=PARTUUID=1234-5678 rootfstype=ext4

และแทนที่ด้วย

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

โปรดทราบว่า UUID เป็นสิ่งที่เราคัดลอกมาก่อนหน้านี้โดยไม่มีเครื่องหมายคำพูด

  • ถอนติดตั้งพาร์ติชันสำหรับบูต RPi: sudo umount /mnt
  • เปลี่ยนการ์ด SD เป็น RPi แล้วบูต
  • บน RPi ให้ดูว่าคุณกำลังใช้งานจริงจากการติดตั้งรูท btrfs: mount

    / dev / mmcblk0p2 บน / พิมพ์ btrfs (rw, space_cache, subvol = /)

  • และอื่น ๆ ! ไม่ได้เป็นการชี้และคลิก แต่โดยการยืนบนไหล่ของยักษ์ฉันสามารถทำให้มันทำงานได้ (ทำให้สิ่งนี้กลายเป็น repoด้วย)


1
ด้วยสิ่งแรกsudo apt upgradeถ้ามันอัพเกรดเคอร์เนลการตั้งค่านี้จะล้มเหลวอย่างมากในการบูตเพราะเคอร์เนลใหม่พยายามโหลด initramfs เก่าที่จะล้มเหลวและเคอร์เนลไม่สามารถโหลดไดรเวอร์ btrfs และมันก็ไม่ใช่วิธีที่ง่ายในการแก้ไขอย่างน้อยก็ด้วยchrootระบบ armhf
Ingo

จะไม่มีการเรียกใช้ update-initramfs ในการอัพเกรดเคอร์เนลใช่หรือไม่
Piskvor ออกจากอาคารเมื่อ

1
ไม่ Raspbian เริ่มต้นไม่สามารถสร้าง initramfs ใหม่ได้ ไม่ได้กำหนดค่าไว้สำหรับสิ่งนี้ คุณต้องตรวจสอบด้วยสายตาเสมอว่าapt upgradeกำลังทำอะไรอยู่และสร้าง initramfs ด้วยมือถ้าจำเป็น - ก่อนที่จะบูตเคอร์เนลใหม่ ไม่ใช่งานที่ต้องทำสำหรับผู้เริ่มต้นเพราะความล้มเหลวเป็นอย่างมาก คุณอาจจะดูที่ฉันจะใช้ init ramdisk (initramfs) ในการบูท Raspberry Pi ได้อย่างไร?
Ingo

1
มันมีข้อผิดพลาดเล็กน้อยที่ฉันเพิ่งค้นพบ แต่ไม่ได้รับการแก้ไขจนถึงตอนนี้ เคอร์เนลสนับสนุนทั้งสองรุ่นเช่นและ4.14.98+ 4.14.98-v7+หาก update-initramfs ถูกทริกเกอร์โดยเคอร์เนล update มันจะสร้างสอง initrd.img * หนึ่งสำหรับแต่ละรุ่น สิ่งนี้ไม่พอดีกับ/bootพาร์ติชั่น (ข้อผิดพลาด - พื้นที่ว่าง) และการสร้างไม่เสร็จสิ้น
Ingo

1
MODULES=listผมคิดว่าการใช้
Ingo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.