Btrfs rootファイル・システムの操作

重要:

Oracle Linux 8では、Btrfsファイル・システム、およびこの章で説明されているすべての機能は、Unbreakable Enterprise Kernel (UEK)リリースのみでサポートされています。Btrfsファイル・システムの機能を使用するには、UEK R6以降を使用してシステムをブートする必要があります。

Btrfs rootファイル・システムは、インストール時に作成できます。そのためには、UEK R6以降を使用してシステムをブートする必要があります。

rootファイル・システムのサブボリュームの親のIDを検出するには、次のコマンドを使用します。

sudo btrfs subvolume list /

前のコマンドの出力で、最上位IDが5に設定されている点に注目してください。ファイル・システムの最上位は、事実上ファイル・システムのrootであり、そのファイル・システム内のすべてのサブボリュームへのアクセスに使用できます。

ID 256 gen 1591 top level 5 path boot
ID 258 gen 1591 top level 5 path root
ID 259 gen 1514 top level 5 path home
ID 262 gen 1514 top level 258 path var/lib/portables"

前述の例では、インストールrootファイル・システムのサブボリュームのIDは258です。IDが258のサブボリューム(root)が/としてマウントされています。IDが258のデフォルト・サブボリューム(root)は、アクティブなrootファイル・システムとしてマウントされています。

このmountコマンドでは、rootファイル・システムとしてマウントされているデバイスが示され、サブボリュームID (258)が示されます。

sudo mount|grep 'on / '
/dev/sda2 on / type btrfs (rw,relatime,seclabel,space_cache,subvolid=258,subvol=/root)

なお、前の出力内の最上位ファイル・システムは、デフォルトではマウントされていません。最上位ファイル・システム・ボリュームをマウントするには、次のコマンドを使用します。

sudo mkdir /mnt
sudo mount -o subvolid=5 /dev/sda2 /mnt

/mntのコンテンツをリストすると、rootサブボリュームなど、ファイル・システム・ボリューム内の各サブボリュームを表示できます。

ls /mnt

前述のコマンドを実行すると、次の出力が表示されます。

boot  home  root

なお、次の例で示すように、//mnt/rootの内容は同一です。/mnt/rootに作成されたファイル(foo)は/でも表示されます。

sudo touch /mnt/root/foo
ls /

前述のコマンドを実行すると、次の出力が表示されます。

bin   boot  dev  etc  foo  home  instroot  lib  lib64  media  mnt  opt  
proc  root  run  sbin  srv  sys    tmp  usr  var

今度は、/mnt/rootのコンテンツをリスト表示します。

sudo ls /mnt/root
bin   boot  dev  etc  foo  home  instroot  lib  lib64  media  mnt  opt  
proc  root  run  sbin  srv  sys    tmp  usr  var

/fooディレクトリを削除してから、/のコンテンツをリスト表示します。

sudo rm -f /foo
sudo ls /
bin   boot  dev  etc  home  instroot  lib  lib64  media  mnt  opt  
proc  root  run  sbin  srv  sys    tmp  usr  var

/mnt/rootの内容を再度リスト表示します。

sudo ls /mnt/root
bin   boot  dev  etc  home  instroot  lib  lib64  media  mnt  opt  
proc  root  run  sbin  srv  sys    tmp  usr  var

rootファイル・システムのスナップショットの作成

現在のrootファイル・システムのスナップショットを取得するには:

  1. 適切なマウント・ポイントにrootファイル・システムの最上位レベルをマウントします。

    sudo mount -o subvolid=5 /dev/sda2 /mnt
  2. ディレクトリをマウント・ポイントに変更してスナップショットを取得します。次の例では、rootファイル・システムとしてinstallサブボリュームが現在マウントされています。

    sudo cd /mnt
    sudo mkdir -p /mnt/snapshots
    sudo btrfs subvolume snapshot root snapshots/root_snapshot_1
  3. ディレクトリを/に変更してファイル・システムの最上位レベルをアンマウントします。

    sudo cd /
    sudo umount /mnt 

    サブボリュームのリストに、新規作成されたスナップショットが含まれるようになります。

    sudo btrfs subvolume list /
    ID 256 gen 1332 top level 5 path boot
    ID 258 gen 1349 top level 5 path root
    ID 259 gen 1309 top level 5 path home
    ID 261 gen 1309 top level 258 path var/lib/portables
    ID 264 gen 1348 top level 5 path snapshots/root_snapshot_1

rootファイル・システムとしての代替スナップショットのマウント

システムの変更をロールバックする場合は、デフォルトのサブボリュームとしてそのIDを指定し、rootファイル・システムとしてスナップショットをマウントできます。

sudo btrfs subvolume set-default 264 /

GRUBコマンドラインによって設定が上書きされないようにするには、次のように更新します。

current_grub_kernel=$(sudo grubby --default-kernel);
sudo grubby --remove-args="rootflags=subvol=root" --update-kernel $current_grub_kernel

変更を有効にするには、システムを再起動します。

スナップショット・サブボリュームIDとサブボリュームがrootファイルシステムとしてマウントされていることを確認します。

sudo mount|grep 'on / '
/dev/sda2 on / type btrfs (rw,relatime,seclabel,space_cache,subvolid=264,subvol=/snapshots/root-snapshot1)

rootファイル・システムのスナップショットの削除

ノート:

スナップショットは、サブボリュームのデフォルトIDとして設定されていると削除できません。rootファイルシステムとして使用中のスナップショットを削除すると、システム障害が発生して、ハードの物理リセットが必要になることがあります。rootファイル・システムのデフォルト・サブボリュームとして設定されているスナップショットを削除する前に、デフォルトIDを変更して、システムをリブートします。次に例を示します。

sudo btrfs subvolume set-default 258 /
reboot

スナップショットを削除するには、次の手順を実行します。

  1. 次のようにファイル・システムの最上位レベルをマウントします。

    sudo mount -o subvolid=5 /dev/sda2 /mnt
  2. ディレクトリをマウント・ポイントに変更してスナップショットを削除します。

    $ sudo cd /mnt
    sudo btrfs subvolume delete snapshots/root-snapshot1
  3. ディレクトリを/に変更してファイル・システムの最上位レベルをアンマウントします。

    sudo cd /
    sudo umount /mnt 

    サブボリュームのリストには、snapshots/root-snapshot1が含まれなくなります。

    sudo btrfs subvolume list /
    ID 256 gen 1332 top level 5 path boot
    ID 258 gen 1349 top level 5 path root
    ID 259 gen 1309 top level 5 path home
    ID 261 gen 1309 top level 258 path var/lib/portables