xfs_freeze
xfsファイルシステムを固定または固定解除するために使用するもの:
xfs_freeze -f /blahblah
xfs_freeze -u /blahblah
unfreezeコマンドを実行した後、ファイルシステムが固定されていないことを確認したいと思います。このコマンドは値やメッセージを返しません。
ファイルシステムを再マウントしてみることはできますが、完全に信頼できません。
また、固定されていないファイルシステムでunfreezeコマンドを再実行すると、次の結果が表示されます。
xfs_freeze: cannot unfreeze filesystem mounted at /blahblah: Invalid
argument
この方法も情報が正確ではないので完璧ではありません。
ファイルシステムの固定状態を知らせるコマンドはありますか?それともこれを確認するために使用できる確実な方法はありますか?
どのようなヒントがありますか?
答え1
簡単に言うと:
ファイルシステムが固定されているかどうかを直接照会する方法はありませんが、入れ子になった固定試行が機能しないことを悪用する可能性があります。たとえば、/ xfs_testにXFSファイルシステムをマウントしました。
[root@testvm1 ~]# mount | grep xfs_test
/dev/sdb1 on /xfs_test type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@testvm1 ~]# xfs_freeze -f /xfs_test/ # Initial freeze
[root@testvm1 ~]# echo $?
0
[root@testvm1 ~]# xfs_freeze -f /xfs_test/ # Subsequent freeze attempt
xfs_freeze: cannot freeze filesystem at /xfs_test/: Device or resource busy
[root@testvm1 ~]# echo $?
1
ファイルシステムを解放または解放する場合でも、同じたとえ話が適用されます。
[root@testvm1 ~]# xfs_freeze -u /xfs_test/ # Same filesystem, currently frozen
[root@testvm1 ~]# echo $?
0
[root@testvm1 ~]# xfs_freeze -u /xfs_test/ # Thawed filesystem
xfs_freeze: cannot unfreeze filesystem mounted at /xfs_test/: Invalid argument
[root@testvm1 ~]# echo $?
1
凍結/解凍状態の照会が可能かどうかを判断するために、少し調査を行う必要がありました。技術的な詳細は私が理解できる範囲を少し超えていますが、私がまとめた内容は次のとおりです。
ファイルシステムの凍結と凍結解除は、元々XFS用に構築された機能です。結局、Linuxカーネルに導入され、この機能が他のファイルシステムでも動作できるようになりました。 〜のようにこのLWN記事説明する:
佐藤隆はXFS関連の機能をインポートし、ファイルシステムコードに移動することを提案しました。パッチは、ファイルシステムへの書き込みアクセスを中断するためのioctl()、書き込み再開のための固定および固定解除オプションを提供します。
...
デフォルトでは、このパッチはユーザーがアクセスできるようにFreeze_bdev()カーネル関数をエクスポートします。 Freeze_bdev() はスーパーブロックをフラッシュし、デバイスを同期してファイルシステムを一貫した状態にロックします。パッチはまた、struct block_deviceステータスフィールドに固定ステータストレースを追加します。
この時点でネストされた凍結と解凍が可能です。私が理解したように、コードのカウンタ変数は入れ子になった固定と固定解除の試みを追跡します。この変数は冷凍時に増加し、解凍時に減少します。カウンタがゼロに達した場合にのみ、ファイルシステムは実際にアンロックされます。
後で、ファイルシステムの状態を照会するために新しいioctl呼び出しを追加することに関する2016年のパッチディスカッションを発見しました。fs: FIGETFROZEN ioctl 呼び出しを追加。私が知っている限り、このパッチはまだカーネルにマージされていません。
パッチディスカッションはいくつかの重要なポイントを提供します。
さらに、ユーザ空間で固定状態をポーリングすることは本質的に危険である。システムコールが返されると、情報が正しくない可能性があるため、ユーザー空間で決定を下すときにはそれに頼ることはできません。
それから:
私の[sic]クイック調査によると、5年前にbtrfsでioctl凍結を操作するために意図的にネストが壊れています。
これは上記の解決策をもたらした。
もう一つの可能性があります。この答えはStackOverflowにあります。。固定ファイルシステムを再マウントしようとすると、「デバイスが使用中です」エラーで失敗します。マウントは他のさまざまな理由で使用量が多い可能性があるため、このソリューションは完璧ではありません。
答え2
確認を実行するには、独自のコマンドを作成する必要があると思います。
#!/bin/bash
function touchFs() {
echo "mp: $1";
touch "$1/frzn-5tst";
if [ -f "$1/frzn-5tst" ]; then
rm "$1/frzn-5tst" &> /dev/null;
fi
}
function usage() {
echo "$0 <mountpoint>";
exit 1;
}
if [ -z $1 ]; then
usage;
fi
touchFs $1&
ppid=$!;
state=`ps -o s= -p $ppid`;
if [ -z "$state" ]; then
echo "device is unfrozen";
elif [ "$state" == "S" ]; then
echo "device is frozen";
fi