回答:
btrfsがカーネルモジュールとしてコンパイルされている場合は、起動時にモジュールをロードするinitramfsを作成する必要があります。Raspian(および他のdebian派生物)では、これ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
。
私の簡単なテストでは、btrfsサポートがraspbianの外部モジュールとして構築されており、カーネルに直接リンクされていないことが示されています。
つまり、カーネルは、ルートファイルシステムのマウント方法を認識する前に、そのモジュール(ルートファイルシステムに格納されている)をロードできる必要があります。明らかに、これは機能しません。
アプローチ1:
独自のカーネルをビルドし、ビルド構成を調整してbtrfsを事前にリンクします。独自のカーネルを構築してロードする方法を理解していれば、設定の調整は簡単です。
アプローチ2:
カーネルとモジュールがext4ファイルシステムにあり、最も圧縮したいデータがbtrfsパーティションにあるように、再調整してください。
アプローチ2A:
ルートパーティションをext4のままにして、btrfsベースの新しいパーティションを作成しますが、それがOSインストールの縮小に役立ちません(それが目的の場合)。
アプローチ2B:
小さなブートパーティションを作成し、カーネルとモジュールを保持し、その他はすべてbtrfsに残します。私はこれをPiのブートローダーでどのように行うのか、またはこれに関する制限は何なのかわかりません。
Raspbianカーネルにはbtrfs
デフォルトでサポートが含まれていません。最初の起動段階は正常に実行されますが、カーネルが読み込まれると、マウントできるファイルシステムが表示されず、パニックが発生します。解決策があります:initramfsで、カーネルモジュールとしてbtrfsを追加します。主に3つの 異なる 記事のおかげで、次のように設定しました。
sudo apt install btrfs-tools initramfs-tools
echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
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
代わりにupdate()を使用する必要があります。これにより、/ boot / initrd.img- *のような名前のファイルが作成されます。*は現在のカーネルバージョンです。生成された名前に注意してください(スクリプトが出力します)。次のステップで使用します。update-initramfs -c -k $(uname -r)
/boot/config.txt
このinitramfsを使用するように編集し、追加しinitramfs initrd.img-3.11.0+ followkernel
ます。ファイル名はパスなしで、前のステップで生成されたものです。「followkernel」はメモリ内の場所を制御します(config.txtドキュメント)。これで現在のカーネルは解決されますが、@ Ingoが指摘したように、カーネルをアップグレードするとシステムが壊れます。これを修正するために、私は彼のカーネルインストールフックスクリプトを使用しました。
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
それこの時点で、ルートデバイスとして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カードを再度マウント解除します)
mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
次のような行があるはずです。
/dev/mmcblk0p2 / ext4 foo,bar,baz 0 1
これを次のように変更します(新しいFSタイプはbtrfsで、デフォルトのオプションを使用します):
/dev/mmcblk0p2 / btrfs defaults 0 1
sudo umount /mnt
新しい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
sudo nano /mnt/cmdline.txt
これら2つのパラメーターを見つける
root=PARTUUID=1234-5678 rootfstype=ext4
と置き換えます
root=UUID=cafebeef-0000-1234-aaaa-12346589 rootfstype=btrfs
UUIDは引用符なしで先ほどコピーしたものであることに注意してください。
sudo umount /mnt
RPiで、実際にbtrfsルートマウントから実行していることを確認します。 mount
/ dev / mmcblk0p2 /タイプbtrfs(rw、space_cache、subvol = /)
エボラ!ポイントアンドクリックではありませんが、巨人の肩の上に立つことで、それを機能させることができました。(これもレポにしました。)
sudo apt upgrade
場合、カーネルもアップグレードすると、新しいカーネルは古いinitramfsをロードしようとして失敗し、カーネルがbtrfsドライバーをロードできないため、このセットアップは起動時に劇的に失敗します。そして、少なくともchroot
armhfシステムでは、簡単に修正することはできません。
apt upgrade
新しいカーネルを起動する前に、何をしているのかを常に監視し、必要に応じて手動でinitramfsを生成する必要があります。失敗することは劇的であるため、初心者にとって実行可能なタスクではありません。Raspberry Piの起動時にinit ramdisk(initramfs)を使用するに
4.14.98+
となどの2つのモデルをサポートしています4.14.98-v7+
。カーネルの更新によってupdate-initramfsがトリガーされると、モデルごとに1つずつ、合計2つのinitrd.img *が生成されます。これは/boot
パーティションに適合せず(エラー-スペース不足)、生成は完了しません。
MODULES=list
。