रास्पबियन पर btrfs रूट फाइलसिस्टम


11

मुझे लगा कि मैं रूट विभाजन के रूप में btrfs के साथ विस्तार कर सकता हूं, यह देखने के लिए कि बिजली कटौती के दौरान यह भ्रष्टाचार को कैसे संभालता है। लेकिन मैं इसे बूट नहीं कर सकता।

मैंने क्या किया:

  1. स्विच करने से पहले PI पर:

    apt-get install btrfs-tools 2. एक लिनक्स कंप्यूटर से:

    btrfs-Convert / dev / sda2

  2. को /etc/fstabबदलने के ext4लिएbtrfs

  3. को /cmdline.txtबदलने के ext4लिएbtrfs

यदि मैं बूट करने की कोशिश करता हूं तो मुझे कर्नेल घबराहट होती है। क्या मुझे कुछ और करना चाहिए?

जवाबों:


7

यदि btrfs को कर्नेल मॉड्यूल के रूप में संकलित किया जाता है, तो आपको बूट पर मॉड्यूल को लोड करने के लिए एक initramfs बनाने की आवश्यकता है। रास्पियन (और अन्य डेबियन डेरिवेटिव) पर, 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>

अंतिम चरण इसे अपने बूट कॉन्फिगर में जोड़ना है: निम्न पंक्ति को इसमें जोड़ें /boot/config.txt:

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>फ़ाइल के नाम से बिल्कुल मेल खाना चाहिए /boot

आपको हर बार दौड़ने के बाद ये चरण दोहराने होंगे rpi-update


2

मेरे त्वरित परीक्षण से पता चलता है कि btrfs समर्थन रास्पबियन में एक बाहरी मॉड्यूल के रूप में बनाया गया है, सीधे कर्नेल में जुड़ा नहीं है।

इसका मतलब है कि कर्नेल को उस मॉड्यूल को लोड करने में सक्षम होना चाहिए (जो रूट फाइल सिस्टम पर संग्रहीत है) इससे पहले कि वह रूट फाइल सिस्टम को माउंट करना जानता है। जाहिर है, यह काम नहीं करता है।

दृष्टिकोण 1:

अपने कर्नेल का निर्माण करें, और इसे पूर्व लिंक btrfs से कॉन्फिगर करें। यदि आपके निर्माण और अपने कर्नेल को लोड करने का तरीका पता चल गया है, तो विन्यास को आसान बनाना आसान है।

दृष्टिकोण 2:

Readjust चीजें इसलिए कर्नेल और मॉड्यूल एक ext4 फाइल सिस्टम पर हैं और जिस डेटा को आप कंप्रेस करना चाहते हैं वह एक btrfs पार्टीशन पर है।

दृष्टिकोण 2A:

मूल विभाजन को ext4 के रूप में छोड़ दें और एक नया विभाजन बना रहे हैं जो कि btrfs आधारित है, लेकिन यह OS स्थापना को कम करने में मदद नहीं करता है (यदि यह आपका लक्ष्य है)।

दृष्टिकोण 2B:

बूट विभाजन बनाएँ जो छोटा है, और कर्नेल और मॉड्यूल को रखता है, जबकि बाकी सब कुछ btrfs पर छोड़ता है। मुझे नहीं पता कि यह कैसे एक पाई बूटलोडर के लिए करना है, या इसके आसपास क्या सीमाएं हैं।


बूट विभाजन के लिए btrfs मॉड्यूल की प्रतिलिपि बनाने और उन्हें पहले से वहां से लोड करने के बारे में क्या?
ग्यूसॉफ्ट जूल

3
क्या यह initrd.img के साथ शुरू करना संभव नहीं है?
एंडर्स

हाँ, और initrd.img इसे हल करने का सबसे आसान तरीका है! मैंने अभी इसका उपयोग नहीं किया है। "Mkinitrd" पर डॉक्स देखें।
डॉनगर

हम्म लगता है कि CONFIG_BLK_DEV_INITRD नवीनतम रास्पियन में सक्षम नहीं है। इसका मतलब है कि आपको initd समर्थन को सक्षम करने के लिए कर्नेल को फिर से जोड़ना होगा।
ग्यूसॉफ्ट जूल

1
Paxswill.com/blog/2013/11/04/encrypted-raspberry-pi देखें - वहाँ एन्क्रिप्टेड रूट एन्क्रिप्टेड रूट की अनुमति देने के लिए उपयोग किया जाता है। इसी तरह, रूट उपलब्ध होने से पहले cryptsetup (यहां btrfs) के लिए समर्थन की आवश्यकता है।
Rbjz

1

अपने बाहरी BTRFS रूट विभाजन को खोजने के लिए, मुझे बूट विभाजन में रूट विभाजन के UUID को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता थी cmdline.txt। उदाहरण के लिए:

dwc_otg.lpm_enable = 0 कंसोल = tty1 root = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype = btrfs कॉलम - समय- सीमा rootwait शांत छप

आप BTRFS विभाजन के UUID का उपयोग करके निर्धारित कर सकते हैं lsblk -f


1

रास्पियन कर्नेल में btrfsडिफ़ॉल्ट रूप से समर्थन शामिल नहीं है ; प्रारंभिक बूट चरण सामान्य रूप से चलते हैं, लेकिन जब कर्नेल लोड होता है, तो यह किसी भी फाइलसिस्टम को नहीं देखेगा जिसे यह माउंट कर सकता है - और पैनिक। एक समाधान मौजूद है: कर्नेल मॉड्यूल के रूप में, इनट्राम्राम्स में btrfs जोड़ें। तीन अलग-अलग लेखों के लिए धन्यवाद , मैंने इसे इस प्रकार स्थापित किया है:

  • आवश्यक पैकेज स्थापित करें - कर्नेल मॉड्यूल, और इसके साथ initramfs को अपडेट करने के लिए उपकरण: sudo apt install btrfs-tools initramfs-tools
  • Initramfs को btrfs मॉड्यूल को लोड करने के लिए कहें (किसी कारण से, स्वचालित रूप से हो रहा हो, मेरे RPi1 पर काम नहीं किया) - आवश्यक मॉड्यूल की सूची में "btrfs" के साथ एक पंक्ति जोड़ें: echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • Btrfs के लिए एक इनट्रामाफ़्स हुक (छवि निर्माण के लिए) और स्क्रिप्ट (बूटिंग के लिए) बनाएँ - चूक प्रदान की जाती हैं, लेकिन मेरे परीक्षण में, वे स्वचालित रूप से उपयोग नहीं किए गए थे, उन्हें / आदि में कॉपी करना था। 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वर्तमान कर्नेल संस्करण (uname -r) के लिए नया initramfs बनाएं ( ) यदि आप किसी मौजूदा को अपडेट कर रहे हैं, तो आपको -uइसके बजाय अपडेट ( ) का उपयोग करना होगा। यह /boot/initrd.img-* नाम की एक फ़ाइल बनाएगा, जहाँ * वर्तमान कर्नेल संस्करण है। उत्पन्न नाम पर ध्यान दें (स्क्रिप्ट इसे आउटपुट करेगी), हम इसे अगले चरण में उपयोग करेंगे।update-initramfs -c -k $(uname -r)
  • /boot/config.txtइस initramfs का उपयोग करने के लिए संपादित करें , initramfs initrd.img-3.11.0+ followkernelफ़ाइल का नाम पथ के बिना है, यह पिछले चरण में उत्पन्न एक है; "फॉलोकर्नेल" मेमोरी में स्थान को नियंत्रित करता है ( config.txt प्रलेखन )।
  • जो वर्तमान कर्नेल को हल करता है, लेकिन @Ingo ने बताया, कर्नेल को अपग्रेड करने से सिस्टम टूट जाएगा। इसे ठीक करने के लिए, मैंने उसकी कर्नेल-इंस्टॉल हुक स्क्रिप्ट का उपयोग किया :

    • संपादित करें / आदि / डिफ़ॉल्ट / रास्पबेरी-कर्नेल और असहजता INITRD=Yes
    • हटाना /etc/kernel/postinst.d/initramfs-tools
    • जोड़ने आरपीआई-initramfs उपकरण /etc/kernel/postinst.d/ करने के लिए और chmod +xयह
    • वैकल्पिक रूप से, डाउनलोड the-rpi-initramfs को theitramfs के सरल मैनुअल अपडेट के लिए डाउनलोड करें।
  • इस बिंदु पर, हमारे पास एक प्रणाली है जो रूट डिवाइस के रूप में btrfs का उपयोग कर सकती है। रीबूट करके परीक्षण करें: सिस्टम अभी भी ext4 विभाजन से बूट होगा (या जो कुछ भी आपके /boot/cmdline.txt में है ), लेकिन dmesg | grep -i btrfsअब "Btrfs लोडेड" वाली लाइन दिखाना चाहिए। अब हमें वास्तव में एक btrfs विभाजन बनाने और उसका उपयोग करने की आवश्यकता है।

  • /(Ext4) विभाजन का एक बैकअप बनाएं - यह मानते हुए / dev / mmcblk0p2 है - आम तौर पर: आरपीआई को बंद करें, एसडी कार्ड को बाहर निकालें, इसे कहीं और माउंट करें ( sudo mount /dev/mmcblk0p2 /mntलिनक्स कंप्यूटर पर इस उदाहरण में ) और सामग्री को संग्रहित करें; ध्यान दें कि आपको एक उपकरण का उपयोग करने की आवश्यकता है जो स्वामित्व और अनुमतियों को संरक्षित करता है, जैसे टार: cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *(और फिर एसडी कार्ड को फिर से अनमाउंट करें)

  • कहीं एक btrfs विभाजन बनाएं - मैंने ext कार्ड विभाजन (/ 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
  • Btrfs विभाजन पर fstab संपादित करें :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
  • हमें आरपीआई को यह बताने की आवश्यकता है कि वह btrfs से बूट होने जा रहा है
  • अपने नए btrfs विभाजन का UUID ढूंढें - / dev / mmcblk0p2 के साथ लाइन ढूंढें, और UUID = भाग की प्रतिलिपि बनाएँ, (UUID_SUB के साथ, PARTUUID नहीं!) जो बूटलोडर में बग को ट्रिगर करेगा, और कर्नेल बूट नहीं करेगा! ।):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

ध्यान दें कि यूयूआईडी वह है जिसे हमने पहले कॉपी किया था, बिना उद्धरण के।

  • RPI बूट विभाजन को अनमाउंट करें: sudo umount /mnt
  • एसडी कार्ड को आरपीआई, और बूट में बदलें।
  • आरपीआई पर, देखें कि आप वास्तव में एक btrfs रूट माउंट से चल रहे हैं: mount

    / dev / mmcblk0p2 पर / टाइप btrfs (rw, space_cache, subvol = /)

  • Et voilà! काफी बिंदु और क्लिक नहीं, लेकिन दिग्गजों के कंधों पर खड़े होकर, मैं इसे काम कर सकता था। (इसे रेपो में भी बनाया गया है।)


1
पहली बार sudo apt upgradeअगर यह कर्नेल को अपग्रेड करता है तो यह सेटअप बूट पर नाटकीय रूप से विफल हो जाएगा क्योंकि नया कर्नेल पुराने initramfs को लोड करने की कोशिश करता है जो विफल हो जाएगा और कर्नेल btrfs ड्राइवरों को लोड नहीं कर सकता है। और इसे ठीक करने का आसान तरीका नहीं है, कम से कम chrootएक आर्महफ सिस्टम पर।
इंगो

क्या अपडेट-इनट्राम्राम्स को कर्नेल अपग्रेड पर लागू नहीं किया जाएगा?
पिस्कोर ने

1
नहीं, डिफ़ॉल्ट Raspbian एक नया initramfs उत्पन्न करने में विफल रहता है। इसके लिए इसे कॉन्फ़िगर नहीं किया गया है। आपको हमेशा अपनी आंखों के साथ यह देखना होगा कि क्या apt upgradeकर रहा है और यदि आवश्यक हो तो नए कर्नेल को बूट करने से पहले हाथ से एक इनट्राम्रफ उत्पन्न करता है। एक शुरुआत के लिए एक उल्लेखनीय कार्य नहीं है क्योंकि असफल होना नाटकीय है। आप देख सकते हैं कि मैं रास्पबेरी पाई को बूट करने के लिए एक init ramdisk (initramfs) का उपयोग कैसे कर सकता हूं?
ingo

1
यह एक छोटा सा बग है जिसे मैंने अभी पाया है लेकिन अभी तक तय नहीं किया गया है। कर्नेल दो मॉडलों का समर्थन करता है, जैसे 4.14.98+और 4.14.98-v7+। यदि अपडेट-इनिट्रामाफ़्स को कर्नेल अपडेट द्वारा ट्रिगर किया जाता है तो यह दो initrd.img * उत्पन्न करेगा, प्रत्येक मॉडल के लिए एक। यह /bootविभाजन (त्रुटि - अंतरिक्ष से बाहर) पर फिट नहीं होता है और पीढ़ी खत्म नहीं होती है।
इंगो

1
मैं उपयोग करने पर विचार करता हूं MODULES=list
इंगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.