私は現在、基本的なファイルシステムの抽象化(C ++で書かれています)を作成しており、Linuxに「有用な」マウントデバイスのリストをインポートする必要があります。
getmntent
getmntent_r
簡単に解析できる機能が見つかりまし/etc/mtab
たが、/proc/mounts
インストールされている多くのデバイスは「有用」ではありません(例/sys/fs/cgroup/net_cls
:)。特に、物理デバイス、パーティション、またはネットワーク共有/ドライブに関連するインストールを見つけようとします。
私が見つけた最も近い方法はmnt_fsname
(デバイス名)がで始まることを確認することですが/
、私のシステムでは次のように範囲が狭くなりました。
/
/boot
/run/media/[username]/0CA8-1F2D
/run/media/[username]/14E0-3E80
これが私が望むようです(最後の2つはUSBスティックのパーティションです)。しかし、これを使ってネットワーク共有/デバイスを試す機会はありませんでした。
デフォルトでは、これはWindowsなどの「ドライブ」に近いと見なされるため、物理デバイスなどに興味がありますが、これは図書館のユーザーが必要な場合はリストにないデバイスに移動するのを防ぎません。
したがって、デフォルトでは、質問は次のように要約されます。
マウントエントリのデバイス名がaで始まる場合、
/
物理デバイス、パーティション、またはネットワーク共有は保証されますか?特に重要または有用なものがありませんか?
これを行うより良い/より正確な方法はありますか?
答え1
私は「有用なマウント」という概念がすべての状況で意味があるとは思わない。リムーバブル物理ドライブとネットワークマウントを含み、以下のファイルシステムなどのファイルシステムをシステムアクセスから除外しようとして/dev
い/proc
ます/sys
。ユーザーマウントファイルシステムはどうですか? FUSEがファイルシステムを提供していることを知っていても、それが何であるかはわかりません。アーカイブ、ネットワークマウント、ディレクトリの代替ビュー、ディスクイメージ、一部のプログラムを制御する方法などが考えられます。
デバイス名が次から始まるかどうかを確認するのは/
私にとっては役に立たないようです。たとえば、バンドルインストールは含まれ、ネットワークインストールは除外されます。
私はあなたができる最高のことは車輪を再発明しないことだと思います。他に何もない場合は、他の人と同じメカニズムを使用してユーザーを混乱させることはありません(「なぜXはこのファイルシステムをリストしますが、Yはリストしないのですか?」)。しかも、他の人がやっていることが意味がある可能性もあります。
だから私の提案は、少なくともGTK +であるGnomeライブラリを使用することです。 GTK+にファイルを開くダイアログボックス「場所」の下にマウントされたいくつかのファイルシステムが表示されます。ユーザーは次のことができます。そこにリストされている内容を制御してくださいある程度- 彼らが理解できるなら、それは。 GTK+でファイルを開くダイアログボックスを表示しなくても、同じ「場所」リストを使用できます(そのリストを取得する方法はわかりません。APIドキュメントを確認してください)。
答え2
「有用性」は視点の問題ですが、とにかく私の考えは次のとおりです。
const getMount = (mountId, _parentID, _deviceNo, root, mountPoint, mountOptions, _fields, _mountSource, superOptions, blob) => (
{
mountId,
// parentID,
// deviceNo,
root,
mountPoint,
mountOptions: mountOptions.split(','),
// fields,
// mountSource,
superOptions: superOptions.split(','),
blob
})
const mounts = fs.readFileSync('/proc/self/mountinfo', 'utf-8')
mounts.split(/\n/)
.filter(l => l.length > 0) // filter empty line at end
.map((m) => getMount(...m.split(' ')))
.filter((m) =>
!/^\/(snap|run|sys|proc|dev)($|\/)/.test(m.mountPoint) &&
!['mqueue', 'tmpfs'].includes(m.superOptions) &&
!m.superOptions.includes('mqueue') &&
!m.superOptions.includes('tmpfs') &&
!m.mountOptions.includes('ro')
)
.map((l) =>
console.log(l))
(必要なのは通常ファイルを削除できるデバイスなので、ごみ箱のパスに関連することが重要です(これを計算する方法は別の話です))