今まで漠然と見ていた(かもしれない)「ls -l」コマンドには、実にたくさんの情報が詰め込まれています。1つ1つの意味を理解することで、Linuxではファイルがどのように管理されているかが見えてきます。
ファイルには内容の他にも、「所有者」や「更新日時」などの情報が付属しています。これらの情報を「属性」と呼びます。
ファイルの属性は、「ls」コマンドの「-l」オプションや(画面1)、「stat」コマンドで確認できます(画面2)。
「ls -l」コマンドで表示される内容の最初の1文字は「ファイルの種類」を示しており、例えばディレクトリなら「d」、シンボリックリンク(実体は別の所にあるファイル)ならば「l」、通常のファイルならば「-」と表示されます。
ファイルの種類の次に表示されている3組の「rwx」の組み合わせが「パーミッション(許可属性)」で、この部分だけを属性と呼ぶこともあります。その次に表示されているのが「ハードリンク数」(結び付けられている名前の個数)で、その後に「所有者」と「所有グループ」「ファイルサイズ」「(ファイルの)タイムスタンプ(最終更新日)」が続きます。
まずは、ファイルの属性から順番に見ていきましょう。
※CentOSの場合、SELinux(NSA Security-Enhanced Linux)で使われる“セキュリティコンテキスト”が付いたファイルは、9桁のパーミッションの後ろに「.」が表示されます。セキュリティコンテキストは、ファイルの拡張属性を設定する「setfattr」コマンドで変更できます。
「ls -l」コマンドの1文字目には、「ファイルの種類」が表示されます。通常使われるのは、「d」「l」「-」の3種類になります。その他に、特殊ファイルがあります(表1)。
ls -lでの表示 | 意味 |
---|---|
- | 普通のファイル(Regular File) |
d | ディレクトリ |
l | シンボリックリンク |
c | キャラクタ型デバイスファイル(特殊ファイル) |
b | ブロック型デバイスファイル(特殊ファイル) |
表1 「ls -l」で表示されるファイルの種類 |
ファイルのアクセス権などを決定するのが、「パーミッション(許可属性)」になります。
パーミッションには「読み出しの許可」「書き込みの許可」「実行の許可」の3種類があります。例えば、読み出し許可のないファイルの中身を見ようとした場合は、「Permission denied(許可されていない)」というエラーが表示されます。コマンドも許可が与えられて、初めて実行可能になります(参考記事:連載「“応用力”をつけるためのLinux再入門(第8回)」)。
パーミッションは、“3文字のアルファベット×3組”で表示されます(画面3)。
3文字のアルファベットは、それぞれ「読み出し(r)」「書き込み(w)」「実行許可(x)」を示しています。「-」の場合は、該当する許可がありません。例えば、「rwx」ならば読み出し、書き込み、実行の全てが可能であり、「r--」ならば読み出しはできても、書き込んだり、実行したりすることはできません。
“3組”が意味するのは「所有者」「グループ」「他人(所有者でも所有グループでもない人)」で、例えばパーミッションが「rwxr-x---」ならば、所有者は読み書き実行が全て許可(rwx)、グループは読み出しと実行が許可(r-x)、それ以外の人は全ての操作が一切不可(---)という意味になります。なお、パーミッションは「chmod」コマンドで変更できます。
ディレクトリの場合、読み出しは「ファイル一覧の表示」、書き込みは「ファイルの追加」、実行は「cd」コマンド(ディレクトリを移動する)でそのディレクトリに入れるかどうかを意味します。
例えば、各ユーザーのホームディレクトリは「rwx------」にパーミッションが設定されており、所有者以外はlsコマンドでファイルを一覧表示したり、ファイルを追加したり、cdコマンドで中に入ったりすることはできません(画面4)。
パーミッションは“3桁の数字”で表現されることもあります。「読み出し可能(r)=4」「書き込み可能(w)=2」「実行可能(x)=1」で、読み出しと書き込みが可能な場合は「4+2=6」と表現されます。全ての操作が可能な場合は「4+2+1」で「7」、全ての操作が不可の場合は「0」になります。
この数値が所有者、グループ、他人(所有者でも所有グループでもない人)の順に並び、3桁の数字となっています(表2)。
パーミッション | 数値 | 意味 |
---|---|---|
r | 4 | 読み出し可能(ディレクトリの場合は、ファイル一覧の表示の許可) |
w | 2 | 書き込み可能(ディレクトリの場合は、ファイルの追加/削除の許可) |
x | 1 | 実行可能(ディレクトリの場合は、cdコマンドでそのディレクトリに入れるかどうか) |
- | 0 | 許可がない |
表2 パーミッションと数値の対応 |
※パーミッションの0~7の数値は、2進数で見た場合に“どのビットが立っているか(1になっているか)”で管理されています。パーミッションの数値の「4」「2」「1」を2進数で表現すると、それぞれ「100」「010」「001」となり、「6(4+2)」ならば「110」、「7(4+2+1)」は「111」となります。
※パーミッションは、0~7×4桁の数で管理されています。2~4桁目は「ls -l」コマンドで表示される3セット(所有者、グループ、他人)に対応しています。1桁目は特殊な属性で、「4」には「set-user-ID(SUID)」、「2」には「set-group-ID(SGID)」(それぞれ、実行時に所有者または所有グループの権限を引き継ぐという意味)、「1」にはディレクトリに設定した場合には「削除制限」、ファイルの場合は「スティッキー(sticky属性)」が設定されている、という意味があります。削除制限とは、ファイルの削除やリネームを所有者だけが行えるというもので、sticky属性は、実行可能ファイルにセットしている場合、そのファイルが読み込んだテキストイメージを終了後もメモリに残すという働きがあります。
全てのファイルには“名前”が付いています。ファイルの名前には「本名」と「別名」の2種類があり、それぞれ複数持つことができます。ファイルの“本名”を「ハードリンク」、“別名”を「シンボリックリンク」と呼びます。
ハードリンクとシンボリックリンクは、「ln」コマンドで増やすことができます。なお、自分で増やすという場合、通常はより自由度の高いシンボリックリンクを使います(※)。
※ハードリンクはその性質上、リンクしたいファイルが「同じファイルシステム上に存在しなければならない」という制限があります。しかし、シンボリックリンクの場合には、そのような制限はありません。
ディレクトリの場合は「usr」や「home」といった名前の他に、自分自身を示す「.」というハードリンクが自動で作成されます。従って、ディレクトリにはハードリンクが「最低2つある」ことになります。
サブディレクトリがある場合は、サブディレクトリから見た「..」(親ディレクトリ)があるため、ハードリンクの数は3つとなります。つまり、特別にハードリンクを増やしていない限り、ディレクトリのハードリンク数は「サブディレクトリの数+2」となります。
データファイルは「Document」ディレクトリの下に用途別に分けて管理し、よく使うファイルだけは「Desktop」に“ショートカット”を置いておく、という使い方はGUI環境ではおなじみでしょう。ショートカットは“近道”という名前の通り、目的のファイルへの「パス」が入っており、ショートカットを扱えるアプリケーションであればリンク先のファイルを簡単に開いたりすることができます。
シンボリックリンクは、普段はそれがシンボリックリンクであることや、実体がどこにあるかということを意識することなく、操作できるようになっています(※)。OSが面倒を見ているので、アプリケーション側が対応する必要はありません。
※一部のファイル操作コマンドは、シンボリックリンクのファイルそれ自体を操作できるように特別なオプションを用意したりしています。例えば、ファイルを圧縮する際に使用する「zip」コマンドには、“シンボリックリンクをリンクとして圧縮する”という意味のオプション(-y)があります。
シンボリックリンクに対するアクセスは、全てリンク先へのアクセスと同等に扱われます。例えば、テキストエディタでシンボリックリンクを開いた場合は、実体を開いた場合と同じように編集することができ、「cp」コマンドでコピーすれば、実体の複製が作成されます。
シンボリックリンクは、「ln」コマンドの「-s」オプションを使い「ln -s リンク先 リンク名」で作成します。
例えば、「man」コマンドで参照するマニュアルが保存されている「/usr/local/share/man」ディレクトリへのシンボリックリンクを、「mandir」という名前でカレントディレクトリに作成する場合は、次のようにコマンドを実行します(画面5)。
ln -s /usr/local/share/man mandir
※「ln」コマンドのファイル名の並べ方は、ファイルをコピーする「cp」コマンドと同じです。「cp コピー元 コピー先」のように指定するので、例えば「cp file1 newfile」では、file1と同じ内容の新しいファイル「newfile」が作成されます。ちなみに、cpコマンドでも「-s」オプションが使え、「cp -s コピー元 コピー先」と指定すると複製を作るのではなく、シンボリックリンクを作るという意味になります。
ちなみに、シンボリックリンクファイルには、リンク先のパス名だけが保存されています。例えば、先ほど作成した「mandir」の場合、「/usr/local/share/man」が20文字(20バイト)なので、ファイルサイズが20となっています。
「ls -l」コマンドでは、ハードリンク数に続いて、ファイルの「所有者」と「所有グループ」が表示されます。
ファイルの所有者と所有グループは、通常はファイルを作成した人と、その人が所属するグループですが、「chown」コマンドと「chgrp」コマンドで変更することもできます。変更の目的は主にパーミッション設定で、“特定グループのユーザーは実行可能”と設定するのに使います。
ちなみに、ユーザーおよびグループは、それぞれID番号(UIDとGID)によって管理されています。lsコマンドやstatコマンドは、「/etc/passwd」ファイルおよび「/etc/group」ファイルからIDに対応する名前を調べて表示しています。名前が分からない場合は、lsコマンドはIDの数値がそのまま、statコマンドの場合は「UNKNOWN」と表示されます(画面6)。
ファイルの時刻には「最終アクセス日(Access)」「最終更新日(Modify)」「最終ステイタス変更日(Change)」の3種類があり、「ls -l」コマンドで表示されるタイムスタンプは「最終更新日(Modify)」になります。
「-u」オプションを併用すると「アクセス時間」、「-c」オプションを併用すると「属性を変更した日」が表示されます。なお、時刻が6カ月以上前の場合は「日付と年」、それ以外は「日付と時刻」が表示されます。
PC-9801N・PC-486DXからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.
Linux & OSS 記事ランキング