Linuxファイルシステムの基本「シンボリックリンク」「iノード」

Unixファイル管理関連

ファイルの種類

Unixで使用するファイルはいずれかの種類になる。

from https://qiita.com/angel_p_57/items/1faafa275525469788b4#%E3%83%91%E3%82%A4%E3%83%97fifo%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AB https://qiita.com/angel_p_57/items/1faafa275525469788b4#%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88 https://qiita.com/akym03/items/aadef9638f78e222de22#%E6%A8%99%E6%BA%96%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0

ハードリンク

ハードリンクは(ほぼ)Unix系のOSにしかない機能です。 ハードリンクを使うことで、ファイルに対して別名を付けることができます。

ハードリンクの特性は以下の通りです。

  • ファイルの実態に対して直接リンクするイメージ
  • 一つの実態のファイルに対して、異なるディレクトリ、同じディレクトリ内に複数のリンクを持つことができる。
  • リンク元のファイルのアクセスする方法と同じ方法でアクセスする
  • リンク元ファイルを編集すればリンク先のファイルも変更される
  • すべてのリンクがなくなるまで実態は消えないリンク元だけを削除してもディスク上のデータは残り続ける。)

リンクを作成するには、lnコマンドを使用します。

ln <origin hard link> <new hard link>

from https://www.infraexpert.com/infra/linux32.html

ただし、以下の点は制限があります。

  • ディレクトリのハードリンクを作成することはできません。循環グラフとなるのを防ぐため。
  • 同じファイルシステム内に含まれているファイルに対してのみ生成することができる。

シンボリックリンク

windowsのショートカットと同じ。 リンク元ファイルを参照し、ディスク上の実態にアクセスするわけではない。 したがって、オリジナルのハードリンクを削除してしまえばシンボリックリンクも無効になる。

シンボリックリンクができたのはハードリンクのデメリットをカバーするためだ。 つまり、

リンクを作成するコマンドは、ln -sのオプションを使用する。

ln <origin hard link> <new hard link>

iノード

UNIXではファイルの内容とファイルのメタ情報を明確に区別しています。 ファイルを取り扱うのにファイルシステムが必要とするすべての情報はiノードと呼ばれるデータ構造に含まれています。 各ファイルごとにiノードが存在し、ファイルシステムを特定するために使用されます。

iノードに含まれる情報はPOSIXが定めてます。

  • ファイルの種類
  • ハードリンクの数
  • ファイルのバイト長
  • バイス番号
  • ファイルを識別するiノード番号。ファイルシステムにて使用
  • ユーザーID
  • ユーザーグループID
  • タイムスタンプ
    • iノード変更時刻
    • 最終アクセス時刻
    • 最終変更時刻
  • アクセス権とファイルのモード

ファイルのiノード情報を調べるにはstatコマンドが有用だ。

stat -l program

実行結果例

  File: "program"
  Size: 4096            Blocks: 8          IO Block: 4096   Directory
Device: 303h/771d       Inode: 6062517     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 500/noriyu-k)   Gid: ( 500/noriyu-k)
Access: Mon Feb 18 00:40:35 2002
Modify: Mon Feb 18 00:35:23 2002
Change: Mon Feb 18 02:52:58 2002

アクセス権とファイルのモード

ファイルには

  • ファイルの所有者
  • ファイルのグループ
  • それ以外のユーザー

のそれぞれに対して

  • 読み込み
  • 書き込み
  • 実行

の三つを定義できる。

加えて、ファイルのモードを定義できる三つのフラグが存在する。 通常、ファイルを実行中のプロセスは、プロセス所有者のUIDで実行される。 このプロセスのUIDを変更できる。

  • suid:実行時にsuidフラグが設定されていると、プロセスはファイル所有者のUIDで実行される。
  • sgid:実行時にsgidフラグが設定されていると、プロセスはファイルのグループIDで実行される。

さらに特殊なモードとして、stickyモードが存在する。

  • sticky:実行が終了した後も、メモリ内にプログラムを残しておくようにカーネルへ要求する。 具体例は、/tmpなど。