2

/sys/devices/platform/power/cdrom の inode 番号がUbuntuと同じなのはなぜですか?

以下は私のUbuntuで同じiノード番号を持っています

./media/BACKUP_1/MISC
./cdrom
./sys/devices/platform/power

ルートで次を実行して取得します

find . -inum 12 2> /dev/null

レフラーの答えに返信する

走る

stat cdrom

私は得る

  File: `cdrom' -> `media/cdrom'
  Size: 11              Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d      Inode: 12          Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-03 04:25:35.000000000 +0300
Modify: 2009-08-03 04:19:05.000000000 +0300
Change: 2009-08-03 04:19:05.000000000 +0300

この情報は何を教えてくれますか?

Leffler の編集への返信

多くの場合、デバイス番号をメジャー デバイス番号とマイナー デバイス番号に分解できます。これは、'ls -l' がデバイスに対して出力するものです。

このコマンドls -l cdromは私にこれを与えます

lrwxrwxrwx 1 root root 11 2009-08-03 04:19 cdrom -> media/cdrom 

ここからデバイスのメジャー番号とマイナー番号をどのように確認できますか?

4

4 に答える 4

6

デバイスはおそらく異なるファイルシステム上にあります-そしてそれはファイルシステムと一意のiノード番号の組み合わせです。

システムコールを使用する場合stat()、関連するフィールドはst_inoandですst_dev(そしてst_rdev特別なデバイスを識別します)。


質問が拡張されました-どの情報から収集できるかを尋ねます:

  File: `cdrom' -> `media/cdrom'
  Size: 11              Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d      Inode: 12          Links: 1

これから収集できることはたくさんあります。重要なのは、このシンボリックリンクがデバイス番号(st_rdev)が0x0801(または2049)のファイルシステム上にあり、iノード番号が12であるということです。多くの場合、デバイス番号をメジャーデバイス番号とマイナーデバイス番号に分類できます。 'ls -lデバイスの印刷。メジャーデバイス番号が8で、マイナーデバイスが1(16進表現0x0801に基づく)である可能性は十分にあります(ただし、これを正式に検証していません)。


質問は2回延長されました:

このコマンドls -l cdromは私にこれを与えます

lrwxrwxrwx 1 root root 11 2009-08-03 04:19 cdrom -> media/cdrom

これからメジャーデバイス番号とマイナーデバイス番号をどのように確認できますか?

簡単な答えは「できません」です。これらのいずれかからの出力は、適切に有益である可能性があります。

ls -l media/cdrom
ls -lL cdrom

前の質問(statコマンドからの出力)に示されているデバイスには、メジャーデバイス8とマイナーデバイス1があります。''ls -lのファイルシステムとしてマウントされているデバイスで''を実行すると、そのことがわかります.。マウントされたデバイスの名前を見つけるために''を使用する場合がdf .あります-おそらく他のメカニズムも機能します。

于 2009-08-17T19:18:47.393 に答える
2

iノードはファイルシステム上のファイルを一意に識別します。あなたの例では、3つの異なるファイルシステムを見ています://media/BACKUP_1(おそらく外部VFAT32ドライブまたはスティック)と/sys

これらは3つの異なるファイルシステムです。同じiノード番号が異なるファイルシステムで使用されることは完全に正常です。iノード番号がすべてのファイルシステムで一意である必要がある場合、いくつかの理由から、これはかなり厳しい要件になります。

  • sizeof(inode_t) 2回しか存在できませんでした。全世界のBITS_PER_BYTEファイルと
  • 地球全体のすべてのコンピューターは、誤って同じ番号を2回配布しないように、常に他のすべてのコンピューターに接続する必要があります。

これを想像してみてください。外部デバイスにファイルを作成します。次に、それを切り離して別のコンピューターに接続します。これにより、ファイルも作成されます。コンピュータAは、どのiノード番号がコンピュータBによってすでに使用されているかをどのようにして知るのでしょうか。

また、あなたの場合、別の特性があり/sysます。「実際の」ファイルシステムではなく、仮想ファイルシステムです。内部カーネルデータ構造をファイルおよびディレクトリとしてのみ公開します。そして、それは常にこれを行うわけではなく、実際にそれを見るときにのみこれを行います–そして、それからファイルが魔法のように生まれます。したがって、そのiノード番号は合成されており、実際にはまったく使用されません。実際、IIRCの一部の仮想ファイルシステムは、すべて0のファイルに対してiノード番号を設定するか、少なくとも、これがあらゆる種類のツールを壊したことに気付くまで試みました。 。

それに加えて、/media/BACKUP_1おそらくDOSファイルシステムであるVFAT32ファイルシステムです。iノードはUnixの概念であるため、VFAT32にはiノードすらありません。また、iノードは合成されます。

実際、最近の多くのUnixファイルシステムにはiノードがなく、ファイルをB +ツリーまたはその他の高度に最適化されたデータ構造に格納し、ツリー内の位置を介して暗黙的にアドレス指定します。Reiser4ファイルシステムには、iノード番号がまったく合成されなかったり、非常に大きなiノード番号が合成されてツールが壊れたりすることがあったため、問題が発生したことを私は知っています。find -inode( 0から見つけられる最大のiノード番号までの配列を単純に構築するのと同様のことを行う必要のあるツールのいくつかの愚かな実装は、非常に大きなiノード番号が提示された場合、マシンで使用可能なすべてのメモリを消費します。)

于 2009-08-17T20:22:29.573 に答える
1

/sys/という名前の別のファイルシステムsysfsです。inode 番号は、グローバル ファイル ツリー内ではなく、特定のファイル システム内でのみ一意です。

于 2009-08-17T20:17:06.573 に答える
0

16 進数と 10 進数を確認するには、次を使用します。

$ echo "obase=16; 2049"|bc 
801
于 2009-08-18T05:22:23.980 に答える