B-Treeファイルシステム(Btrfs)は、Linuxオペレーティングシステム用のコピーオンライト(CoW)ファイルシステムです。 FedoraプロジェクトチームがBtrfsをFedoraWorkstation33のデフォルトのファイルシステムにしたとき、FedoraユーザーはBtrfsを紹介されました。数年間Linuxで利用可能であったにもかかわらず、私はBtrfsについてあまり考えていませんでした。この記事では、Btrfsファイルシステムと、スナップショット、サブボリューム、クォータなどの機能について理解します。
B-Treeファイルシステム(Btrfs)は、ファイルシステムであると同時にボリュームマネージャーでもあります。 2007年から開発中であり、それ以来、Linuxカーネルの一部となっています。その開発者は、大規模なストレージサブシステムへのスケーリングに関連する課題を解決できる最新のファイルシステムを作成することを目指しています。 Btrfsのマンページから、その主な機能はフォールトトレランス、簡単な管理、および修復に焦点を当てています。
FedoraLinuxのBtrfsファイルシステム
その主な機能は次のとおりです。
- スナップショット–書き込み可能で読み取り専用のスナップショット。
- RAID。
- 自己修復–データとメタデータのチェックサム。
- データ破損の自動検出。
- サブボリューム。
- SSDの認識。
- 効率的な増分バックアップ
公式のBtrfsマンページから、その高度な機能と利点について詳しく知ることができます。
前提条件
すでにFedoraWorkstation33を実行している場合は、次のステップに進む準備ができています。そうでない場合は、公式のFedora Workstation ISOをダウンロードしてインストールするか、使用しているLinuxディストリビューションから新しい仮想マシンで実行できます。
この記事を書いているとき、私はBtrfsを操作するためのグラフィカルツールに出くわしていません(提案は大歓迎です!)。したがって、この記事のほとんどのデモンストレーションでは、コマンドラインを使用します。次のステップでは、スーパーユーザーとしてBtrfsを使用する必要があります。
~]$ sudo su # change into super user mode
次のコマンドを実行して、Btrfs形式を調べることができます。
Btrfsファイルシステムを詳しく見る
Fedora Btrfsファイルシステムを表示する:
[root@fosslinux tuts]# btrfs filesystem show Label: 'fedora_localhost-live' uuid: 688a6af2-77e1-4da4-bc63-878c5b0f063b Total devices 1 FS bytes used 18.94GiB devid 1 size 148.05GiB used 21.02GiB path /dev/sda2
ファイルシステムのラベルが「fedora_localhost-live」であることがわかります。ライブUSBバージョンのFedoraを実行していないため、システムのより正確な表現を表すようにラベルを変更できます。
Btrfsラベルの変更:
btrfsfilesystemlabelコマンドを使用してラベルを変更できます。
[root@fosslinux tuts]# btrfs filesystem label / fedora_localhost-live [root@fosslinux tuts]# btrfs filesystem label / fedoraworkstation33 [root@fosslinux tuts]# btrfs filesystem label / fedoraworkstation33 [root@fosslinux tuts]# Btrfs Fedora filesystem label Btrfs subvolumes
サブボリュームはパーティションと同じではありませんが、パーティションと比較することができ、パーティションの使用方法と同様の方法で使用されます。サブボリュームは、Btrfsが管理できる標準ディレクトリです。
サブボリュームを使用して、スナップショットを作成し、クォータを設定して、Btrfsファイルシステムで実行されている限り、他の場所や他のホストオペレーティングシステムに複製できます。
Btrfsサブボリュームのリスト:
[root@fosslinux tuts]# btrfs subvolume list / ID 256 gen 24421 top level 5 path home ID 258 gen 24407 top level 5 path root ID 265 gen 22402 top level 258 path var/lib/machines
サブボリュームを作成する:
btrfs subvolume createコマンドを実行すると、新しいサブボリュームを作成できます。
[root@fosslinux tuts]# btrfs subvolume create /opt/foo Create subvolume '/opt/foo' [root@fosslinux tuts]# btrfs subvolume list / ID 256 gen 24469 top level 5 path home ID 258 gen 24469 top level 5 path root ID 265 gen 22402 top level 258 path var/lib/machines ID 279 gen 24469 top level 258 path opt/foo
サブボリュームの削除:
btrfssubvolumedeleteコマンドを実行してサブボリュームを削除できます。
[root@fosslinux tuts]# btrfs subvolume delete /opt/foo Delete subvolume (no-commit): '/opt/foo' [root@fosslinux tuts]# btrfs subvolume list / ID 256 gen 24495 top level 5 path home ID 258 gen 24493 top level 5 path root ID 265 gen 22402 top level 258 path var/lib/machines
サブボリュームは、特にユーザーを追加するときに、システム管理者にとって便利です。
ユーザーの追加
Fedora Linux 33より前は、新しいユーザーアカウントを作成すると、そのアカウントのホームディレクトリが作成されていました。基本的に、作成されるユーザーディレクトリは/homeのサブディレクトリです。これは、所有権と特権が/homeディレクトリの所有者に合わせて調整されたことを意味します。また、サブディレクトリを管理するための特別な機能がないことも意味します。 Btrfsを使用すると、作成されたユーザーディレクトリに制約を管理および適用するためのより詳細な制御が可能になります。
新しいユーザーを追加する従来の方法。
useraddコマンドを使用して、新しいユーザー「fedoran1」を追加します。
[root@fosslinux tuts]# useradd fedoran1 [root@fosslinux tuts]# getent passwd fedoran1 fedoran1:x:1001:1001::/home/fedoran1:/bin/bash [root@fosslinux tuts]# ls -l /home total 0 drwx------. 1 fedoran1 fedoran1 80 Apr 7 19:00 fedoran1 drwx------. 1 tuts tuts 308 Apr 6 08:33 tuts
ユーザーホームとしてのBtrfsサブボリュームの使用
–btrfs-subvolume-homeをuseraddコマンドに追加することにより、Btrfsサブボリュームをユーザーホームとして収容できます。このコマンドは、ユーザーの新しいBtrfsサブボリュームを作成します。
[root@fosslinux tuts]# useradd --btrfs-subvolume-home fedoran2 Create subvolume '/home/fedoran2' [root@fosslinux tuts]# getent passwd fedoran2 fedoran2:x:1002:1002::/home/fedoran2:/bin/bash
btrfs subvolume list /コマンドを実行すると、新しいユーザーのホームディレクトリの新しいサブボリュームに気付くでしょう。
[root@fosslinux tuts]# btrfs subvolume list / ID 256 gen 24732 top level 5 path home ID 258 gen 24731 top level 5 path root ID 265 gen 22402 top level 258 path var/lib/machines ID 280 gen 24728 top level 256 path home/fedoran2
ユーザーを削除します:
すべてのユーザーのファイルとそのホームディレクトリを同時に持つユーザーを削除したい場合があります。 userdelコマンドを-rオプションとともに使用すると、ユーザーのBtrfsサブボリュームも削除されます。
[root@fosslinux tuts]# userdel -r fedoran2 Delete subvolume (commit): '/home/fedoran2'
Btrfsクォータ
/ homeディレクトリ全体がいっぱいになるまで、制御不能になってディスクに書き込んだプログラムがあったことがありますか?これらの問題は、特にコンテンツとログファイルを保存するアプリケーションまたはサーバーで発生します。 Btrfsクォータを設定して実装することで、ディスクがいっぱいになるためにシステムやサーバーが停止するのを防ぐことができます。
最初のステップは、Btrfsファイルシステムでクォータを有効にすることです:
[root@fosslinux tuts]# btrfs quota enable /
次に、btrfs subvolume listコマンドを使用して、各サブボリュームのクォータグループ(qgroup)ID番号を書き留めます。 btrfs qgroup createコマンドを使用して、ID番号に基づいて各サブボリュームをqgroupに関連付けるのが最適です。これは個別に行うことができますが、次のコマンドを使用して、サブボリュームのqgroupの作成を迅速化することもできます。
>btrfs subvolume list \<path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \<path>
Fedora 33で、\
# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} /
btrfsquota rescanコマンドを実行して、作成したqgroupを表示します。
[root@fosslinux tuts]# btrfs qgroup show / WARNING: rescan is running, qgroup data may be incorrect qgroupid rfer excl -------- ---- ---- 0/5 16.00KiB 16.00KiB 0/256 23.70MiB 23.70MiB 0/258 449.61MiB 449.61MiB 0/265 16.00KiB 16.00KiB 0/279 16.00KiB 16.00KiB
これで、関連付けられたサブボリュームに変更を適用するqgroupにクォータを割り当てることができます。
これで、btrfs qgroup limitコマンドを使用して、ユーザーfedoran2のホームディレクトリの使用を2GBに制限できます。
[root@fosslinux tuts]# btrfs qgroup limit 2G /home/fedoran2
ユーザーfedoran2のクォータ制限の変更を確認します。
[root@fosslinux tuts]# btrfs qgroup show -reF /home/fedoran2 qgroupid rfer excl max_rfer max_excl -------- ---- ---- -------- -------- 0/279 16.00KiB 16.00KiB 2.00GiB none
btrfs qgroup show -re /
を使用して、割り当てられているすべてのqgroupとクォータ制限を表示します(存在する場合)[root@fosslinux tuts]# btrfs qgroup show -reF /home/fedoran2 qgroupid rfer excl max_rfer max_excl -------- ---- ---- -------- -------- 0/279 16.00KiB 16.00KiB 2.00GiB none
Btrfsスナップショット
Btrfsファイルシステムのスナップショットは、単にサブボリュームのコピーです。したがって、スナップショットは、コピーオンライト(CoW)機能を使用して、データとメタデータを他のサブボリュームと共有できるサブボリュームです。スナップショットの作成はすぐに行われますが、スナップショットが作成されるとすぐにスペースを占有することはありません。
スナップショットを作成すると、元のサブボリュームまたは書き込み可能な場合はスナップショットの変更に伴い、スナップショットのスペースが増加します。さらに、サブボリューム内の追加、変更、または削除されたファイルは、引き続きスナップショットに存在します。これらの機能は、システムにバックアップを簡単に作成する方法を提供します。
スナップショットを使用してバックアップを作成する
デフォルトでは、スナップショットはサブボリュームと同じディスクに存在し、スナップショットが作成されたときと同じ状態でファイルのコピーを参照または回復することもできます。スナップショットの興味深い機能は、SSHを使用してスナップショットを外付けハードドライブまたはリモートシステムに送信できることです。問題は、宛先にBtrfsファイルシステムが必要であるということです。スナップショットでこの機能を利用するには、btrfssendコマンドとbtrfsreceiveコマンドを使用します。
注:サブボリュームと同じディスクにスナップショットを保存することは、理想的なバックアップ戦略ではありません。ディスクが破損すると、サブボリュームとスナップショットの両方が失われます。
次の手順に従って、サブボリュームのバックアップを作成します。
1:プロジェクトのサブボリュームを作成します
デモンストレーションの目的で、$ HOME / Desktop / myproject内にBtrfsサブボリューム(myproject)を作成します。 Btrfsサブボリュームは、標準のディレクトリのように見え、機能します。
次のコマンドを使用してサブボリュームを作成します。
[tuts@fosslinux ~]$ btrfs subvolume create $HOME/Desktop/myproject Create subvolume '/home/tuts/Desktop/myproject'
スナップショットを保存する隠しディレクトリを作成します:
[tuts@fosslinux ~]$ mkdir $HOME/.myprojectsnapshots
$ HOME / Desktop / myprojectサブボリューム内にテキストファイルを作成します:
[tuts@fosslinux ~]$ cd /home/tuts/Desktop/myproject [tuts@fosslinux myproject]$ ls [tuts@fosslinux myproject]$ vi day0.txt [tuts@fosslinux myproject]$ ls day0.txt
2:スナップショットを撮る
デフォルトでは、スナップショットは書き込み可能ですが、btrfssendおよびbtrfsreceiveコマンドを使用するには、読み取り専用のスナップショットを作成する必要があります。 ‘
スナップショットは、毎日、1時間ごと、または1分ごとに作成できます。
$ HOME / Desktop / myprojectサブボリュームの読み取り専用スナップショットを作成し、次のコマンドを使用して$ HOME/.myprojectsnapshotsに配置します。
[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day0 Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day0'
注:
- -rフラグを使用して、読み取り専用のスナップショットを作成します。 -rフラグを使用すると、一貫性とセキュリティが向上し、外付けハードドライブとの間で送受信できるようになります。
- スナップショットは、それ自体の再帰的なスナップショットを取得しません。 /homeサブボリュームのスナップショットは$HOME/ Desktop/myprojectサブボリュームのスナップショットにはなりません。
btrfssendとbtrfsreceiveを使用してスナップショットをバックアップします。
以下のデモでは、Btrfsボリュームのスナップショット(/.myprojectsnapshots/myproject-day0)が/ run / media / tuts/bkとしてマウントされたUSBドライブに送信されます。
[tuts@fosslinux ~]$ sudo btrfs send $HOME/.myprojectsnapshots/myproject-day0 | sudo btrfs receive /run/media/tuts/bk At subvol /home/tuts/.myprojectsnapshots/myproject-day0 ERROR: /run/media/tuts/bk doesn't belong to btrfs mount point
USBドライブのフォーマット方法によっては、次のエラーメッセージが表示される場合があります。
ERROR: /run/media/tuts/bk doesn't belong to btrfs mount point.’
このエラーは、USBドライブがbtrfsファイルシステム形式ではないことを示しています。 btrfs sendコマンドは、btrfs以外のファイルシステムでは機能しません。
このようなエラーメッセージが表示された場合は、次のコマンドを使用してUSBドライブをbtrfsにフォーマットします。
USBドライブをbtrfsファイルシステム形式にフォーマットします:
[tuts@fosslinux ~]$ sudo mkfs.btrfs /dev/sdb -L 'bk' -f
次に、btrfssendおよびbtrfsreceiveコマンドを実行します。
[tuts@fosslinux ~]$ sudo btrfs send $HOME/.myprojectsnapshots/myproject-day0 | sudo btrfs receive /run/media/tuts/bk [sudo] password for tuts: At subvol /home/tuts/.myprojectsnapshots/myproject-day0 At subvol myproject-day0
btrfs sendコマンドが正常に完了し、USBドライブでスナップショット「myproject-day0」を表示および参照できます。
サブボリュームのサイズ($ HOME / .myprojectsnapshots / myproject-day0)によっては、コマンドに時間がかかる場合があります。後続の増分btrfs送信には、より短い時間がかかります。
btrfssendを使用した増分バックアップ
btrfs sendを段階的に使用するには、サブボリュームの別のスナップショットを作成する必要があります。
スナップショットを作成する:
[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day1 Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day1'
インクリメンタルbtrfs送信:
[tuts@fosslinux ~]$ sudo btrfs send -p $HOME/.myprojectsnapshots/myproject-day0 $HOME/.myprojectsnapshots/myproject-day1 | sudo btrfs receive /run/media/tuts/bk At subvol /home/tuts/.myprojectsnapshots/myproject-day1 At snapshot myproject-day1
次の増分バックアップ(翌日)。
スナップショットを作成します:
[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day2 Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day2'
インクリメンタルbtrfs送信(翌日):
[tuts@fosslinux ~]$ sudo btrfs send -p $HOME/.myprojectsnapshots/myproject-day1 $HOME/.myprojectsnapshots/myproject-day2 | sudo btrfs receive /run/media/tuts/bk At subvol /home/tuts/.myprojectsnapshots/myproject-day2 At snapshot myproject-day2
クリーンアップ
注:インクリメンタルbtrfs送信を実行するには、少なくとも最後のスナップショットが必要です。スナップショットがソースと宛先に存在することを確認してください。
ソースの場所にあるスナップショットを削除する
次のコマンドを使用して、不要なスナップショットを削除できます。
[tuts@fosslinux ~]$ sudo btrfs subvolume delete $HOME/.myprojectsnapshots/myproject-day0 [sudo] password for tuts: Delete subvolume (no-commit): '/home/tuts/.myprojectsnapshots/myproject-day0'
[tuts@fosslinux ~]$ sudo btrfs subvolume delete $HOME/.myprojectsnapshots/myproject-day1 [sudo] password for tuts: Delete subvolume (no-commit): '/home/tuts/.myprojectsnapshots/myproject-day1'
宛先の場所のスナップショットを削除します:
[tuts@fosslinux ~]$ sudo btrfs subvolume delete /run/media/tuts/bk/myproject-day0 Delete subvolume (no-commit): '/run/media/tuts/bk/myproject-day0'>
[tuts@fosslinux ~]$ sudo btrfs subvolume delete /run/media/tuts/bk/myproject-day1 Delete subvolume (no-commit): '/run/media/tuts/bk/myproject-day1'>
注:新しい増分btrfs送信を実行できるように、送信元と宛先の場所に最後のスナップショットを保持しておくのが最適です。
btrfsスナップショットからファイルまたはディレクトリを復元する
ディレクトリやファイルを誤って削除するなどのエラーは避けられません。このようなエラーが発生した場合は、最近のスナップショットからファイルまたはディレクトリを回復できます。古いスナップショットから古いバージョンのディレクトリまたはファイルを回復することもできます。
スナップショットはディレクトリのように機能するため、cpコマンドを使用して、次のコマンドを使用してファイルを復元できます。
cpコマンドの使用
cpコマンドを使用して削除されたファイルを復元します:
[tuts@fosslinux ~]$ cp $HOME/.myprojectsnapshots/myproject-day1/day0.txt $HOME/Desktop/myproject
cpコマンドを使用して削除されたディレクトリを復元します:
[tuts@fosslinux ~]$ cp -r $HOME/.myprojectsnapshots/myproject-day1/directory $HOME/Desktop/myproject
$ HOME / Desktop / myprojectディレクトリ(サブボリューム)全体を削除すると、サブボリュームを再作成し、cpコマンドを使用してスナップショットからコンテンツ全体を復元できます。
削除したサブボリュームを復元します:
[tuts@fosslinux ~]$ btrfs subvolume create $HOME/Desktop/myproject Create subvolume '/home/tuts/Desktop/myproject'
[tuts@fosslinux ~]$ cp -rT $HOME/.myprojectsnapshots/myproject-day1 $HOME/Desktop/myproject
btrfsスナップショットコマンドの使用
スナップショットのスナップショットを作成することで、削除されたサブボリュームを復元できます。
btrfsスナップショットコマンドを使用してサブボリュームを復元します:
[tuts@fosslinux ~]$ btrfs subvolume snapshot $HOME/.myprojectsnapshots/myproject-day1 $HOME/Desktop/myproject Create a snapshot of '/home/tuts/.myprojectsnapshots/myproject-day1' in '/home/tuts/Desktop/myproject'
外付けドライブからbtrfsスナップショットを復元する
cpコマンドを使用して、USBドライブまたは外付けドライブからスナップショットを復元できます。
ファイルを回復する:
[tuts@fosslinux ~]$ cp /run/media/tuts/bk/myproject-day1/day0.txt $HOME/Desktop/myproject
btrfssendおよびbtrfsreceiveコマンドを使用して、スナップショット全体をリカバリできます。書き込み可能なサブボリュームを復元するには、読み取り専用オプションをfalseに設定する必要があります。
スナップショット全体を復元する:
[tuts@fosslinux ~]$ sudo btrfs send /run/media/tuts/bk/myproject-day1 | sudo btrfs receive $HOME/Desktop/ [sudo] password for tuts: At subvol /run/media/tuts/bk/myproject-day1 At subvol myproject-day1
要約
この記事では、学ぶ価値のあるいくつかのBtrfs機能に焦点を当てています。 BtrfsはZFSファイルシステムの代替として作成され、FedoraおよびLinuxオペレーティングシステム用の多くの高度なファイルシステム機能を提供しています。
btrfsの詳細については、btrfs – –ヘルプコマンドまたはオンラインドキュメントを使用して学ぶことができます。これらには、man btrfs-subvolume、man btrfs-send、またはmanbtrfs-receiveを使用してアクセスできます。公式のBtrfsWikiも便利です。
私たちは皆、Btrfsと対話するためのグラフィカルツールで行うことができます!あなたにとって、Fedoraプロジェクトチーム。