fsconfig
私のカーネルモジュールは、読み取り専用のマウントポイントの再マウントに関連するタスクを管理するシステムコールフックを実装しました。たとえば、ユーザーが実行した場合は、フック内の文字列を抽出する必要がありますmount /dev/sda /tmp/mytest -o remount,ro
。/tmp/mytest
fsconfig
これを達成するために、ファイル記述子を介して構造にアクセスするカーネルfs_context
の方法を調べました。私の目標は、fsconfigシステムコール中にこの構造を介してマウントポイントパスを取得することです。
dentry_path_raw
最初はstart fromのような関数を試してみましたが、結果のfc_context->dentry
文字列は単純で、"/"
私の要件に合っていませんでした。また、を使用してナビゲートしたがシステムコールからアクセスできないとを含む構造がd_path
必要なので、このアプローチは実用的ではありません。path
dentry
vfsmount
vfsmount
fsconfig
__is_local_mountpoint
最後に、カーネルのソースコードでこの関数を見つけました。(fs/namespace.c)。この関数は現在を介して現在のジョブの名前空間にアクセスし、すべてのマウントポイントを繰り返すことを提案します。このコードを適用して、各マウントポイントの mnt_root を fs_context ルートと比較し、そのマウントを正常に識別しました。コードはここにあります。
ns = current->nsproxy->mnt_ns;
lock_ns_list(ns);
list_for_each_entry(mnt, &ns->list, mnt_list) {
if (fc->root == mnt->mnt.mnt_root) {
target_dentry = mnt->mnt.mnt_root;
path.dentry = target_dentry;
path.mnt = &mnt->mnt;
break;
}
}
unlock_ns_list(ns);
namespace_sem
しかし、名前空間.cでの使用には深刻な問題があります。namespace_sem
static( ) と宣言すると、static DECLARE_RWSEM(namespace_sem);
モジュールの内部に直接アクセスできず、潜在的なリスクがあることを意味します。
今私の主な質問は次のとおりです。
fs_context
カーネルコードを変更せずにマウントポイントパスを取得する安全な方法はありますか? (fs_context
常にマウントされたファイルシステムに対応すると仮定します。)- マウントポイントの繰り返しに制限されている場合、セマフォに安全にアクセスできないという問題をどのように解決しますか?
(カーネルバージョン> = 6.6と仮定できます。)