5.4 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
5 セキュリティとファイルパーミッション |
Objective: |
5.4 特殊なディレクトリとファイル |
Lesson: |
1 of 1 |
はじめに
Linuxではすべてがファイルとして扱われますが、一時ファイルなどストアされる場所によって、あるいはリンクなどファイルシステムと作用するために、特別な扱いを受けるものがいくつかあります。このレッスンでは、そういったファイルがどこにあるか、どのように作用するのか、どのように管理するのかを学びます。
一時ファイル
プログラムが短時間だけ必要とするデータを収めるファイルを一時ファイルと言います。実行中のプロセスのデータ、クラッシュログ、自動保管のスクラッチファイル、ファイル変換時に使用される中間ファイル、キャッシュファイルなどがあります。
一時ファイルの場所
FHS (Filesystem Hierarchy Standard)のバージョン3では、Linuxシステムにおける一時ファイルの標準的な場所を定めています。それぞれの場所に異なる目的と動作があり、開発者は一時データをディスクに書き込む際には FHSの規則に従うことが推奨されます。
/tmp
-
FHSによれば、プログラムは、ここに書いたファイルが次回の起動時にも残っていることを前提としてはいけないとされています。システムの起動時にこのディレクトリをクリア(すべてのファイルを削除)することが 推奨 されていますが、必須ではありません 。
/var/tmp
-
一時ファイル用のもう一つのディレクトリです。このディレクトリは、システムの起動時に クリアすべきではない とされています。つまり、ここに置かれたファイルは、リブートしても残っています。
/run
-
このディレクトリには、プロセス識別子ファイル(
.pid
)など、実行中のプロセスが使用する実行時変数のデータが置かれます。プログラムが1つ以上の実行時ファイルを必要とする場合は、ここにサブディレクトリを作ることができます。このディレクトリは、システムの起動時にクリアしなくてはなりません。このディレクトリの目的は、以前は/var/run
が提供していたので、システムによっては/var/run
が/run
へのシンボリックリンクになっていることがあります。
プログラムがシステムの他の場所に一時ファイルを作成するのを妨げるものは何もありません。ただし、FHSによってまとめられた慣例を尊重することがお勧めです。
一時ファイルのパーミッション
マルチユーザーシステムにおいてシステム全体の一時ディクレトリを設けることは、アクセス制限に関する課題が発生します。そのようなディレクトリは、誰もがデータを書けて誰もが削除できる “world writable” なものにすればよいと考えるかもしれません。しかし、そのようにした場合、作成したデータを他の人が削除したり変更する事をどのように防ぐことができるでしょうか?
解決策は、スティッキービット と呼ばれる特殊パーミッションで、ファイルとディレクトリの両方に適用できますが、セキュリティ上の理由からLinuxカーネルはファイルに対するものを無視します。ディレクトリに適用されると、ユーザーは自分が所有するもの以外のそのディレクトリにあるファイルを削除したりリネームすることができなくなります。
スティッキービットがセットされたディレクトリは、ls -l
の出力では その他 のパーミッションにおいて x
を t
に置き換えて表示されます。例として、/tmp
と /var/tmp
のパーミッションを見てみましょう:
$ ls -ldh /tmp/ /var/tmp/ drwxrwxrwt 25 root root 4,0K Jun 7 18:52 /tmp/ drwxrwxrwt 16 root root 4,0K Jun 7 09:15 /var/tmp/
このように、その他 に対するパーミッションで x
が t
で置き換えられていて、どちらにもスティッキービットがセットされています。
ディレクトリにスティッキービットをセットするには、chmod
の数値モードで4桁表記を使い、最初の桁に 1
を指定します。例を示します:
$ chmod 1755 temp
これは、temp
という名前のディレクトリにスティッキービットをセットし、パーミッションは rwxr-xr-t
になります。
シンボリックモードを使う場合には、引数に t
を使います。+t
はスティッキーをセットし、-t
はリセットします。例を示します:
$ chmod +t temp
リンクを理解する
Linuxではすべてがファイルとして取り扱われることを既に述べています。リンク と呼ばれる特殊な種類のファイルがあり、Linuxシステムでは2種類のリンクがあります:
- シンボリックリンク
-
ソフトリンク とも呼ばれ、他のファイルのパスを指し示します。リンクが指すファイル( ターゲット と呼びます)を削除しても、リンクは削除されず、“nothing” を指すものとして機能しなくなります。
- ハードリンク
-
ハードリンクは、元のファイルの第2の名前(別名)と考えましょう。これらは 重複 ではなく、ディスクにあるファイルシステムの同じ場所(inode)を指す、追加のエントリです。
Tip
|
inode (アイノード)とは、ファイルシステム上のオブジェクト(ファイルやディレクトリ)が持つ属性を格納するデータ構造です。それが持つ属性には、ファイル名、パーミッション、所有権、オブジェクトのデータが格納されているディスクブロックなどがあります。これは、インデックスのエントリですから、“index node” から名前が取られました。 |
ハードリンクの使い方
ハードリンクの作成
Linuxでリンクを作成するコマンドは ln
です。基本的な書式は次の通りです:
$ ln ターゲット リンク名
ターゲット
はリンクが指す先のファイルで、既に存在していなくてはなりません。また、ターゲットが現在のディレクトリにないか、リンクを現在のディレクトリではないところに作る場合は、フルパスを指定する必要があります。例を示します:
$ ln target.txt /home/carol/Documents/hardlink
このコマンドは、hardlink
という名前のファイルを /home/carol/Documents/
に作り、現在のディレクトリの target.txt
ファイルに繋げます。
最後の引数である リンク名
を省略すると、ターゲットと同じ名前のリンクが、現在のディレクトリに作成されます。
ハードリンクの管理
ハードリンクとは、ディスク上の同じデータを指す、ファイルシステム上で異なる名前を持つエントリのことです。すべての名前は等価であり、ひとつのファイルを参照します。それらの名前のひとつで内容を変更すると、これらの名前はすべて同じデータを指しているので、他のすべての名前が指すファイルの内容も変わります。ひとつの名前を削除しても、他の名前は引き続き有効に機能します。
実際の所、ファイルを “削除” したときに、ファイルのデータはディスクからは削除されません。システムは単に、ディスクにあるデータに関連する inodeを指すエントリを、ファイルシステムのテーブルから削除するだけです。もし、同じinodeを指す2番目のエントリがあれば、それを手繰ってデータに行き着けます。同じ地点に至る2つの道路と同じだと考えて下さい。一方の道路を閉鎖しても、他方を使って目的地に行き着けます。
ls
の -i
オプションを使って、これを確認できます。次のディレクトリの内容を考察してみましょう:
$ ls -li total 224 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 hardlink 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 target.txt
パーミッションの前に表示される数値が inode番号 です。ファイル hardlilnk
と target.txt
が同じ番号( 3806696
)であることに着目しましょう。これは、1つが他方のハードリンクだからです。
しかし、どちらがオリジナルで、どちらがリンクなのでしょう? 実際の所、同じものなので分かりません。
ファイルを指すハードリンク毎に、ファイルの リンクカウント が増加します。ls -l
の出力で、パーミッションの右に表示される数値がそれです。デフォルトで、すべてのファイルはリンクカウント 1
を持ちます(ディレクトリの場合は 2
です。そして、ハードリンク毎にカウントが1増やされます。上の例でリンクカウントが 2
になっているのはこのためです。
(後述の)シンボリックリンクとの違いは、ハードリンクはファイルに対してだけ作成できること、リンクとターゲットが同じファイルシステムに属していることが必要であることです。
ハードリンクの移動と削除
ハードリンクは通常ファイルなので、rm
で削除したり、mv
でファイルシステム内を移動ないしリネームしたりできます。また、ハードリンクはターゲットと同じinodeを指すので、移動してもリンクが “壊れる” ことはありません。
シンボリックリンク
シンボリックリンクの作成
シンボリックリンクを作るにも ln
を使いますが、次のように -s
オプションを追加します:
$ ln -s target.txt /home/carol/Documents/softlink
このコマンドは、/home/carol/Documents/
ディレクトリに softlink
というファイルを作り、現在のディレクトリにあるファイル target.txt
を指し示します。
ハードリンクと同様にリンク名を省略すると、ターゲットと同じ名前のリンクを現在のディレクトリに作成します。
シンボリックリンクの管理
シンボリックリンクは、ファイルシステム内の他のパスを指し示すものです。異なるファイルシステム間であっても、ファイルやディレクトリ に対するシンボリックリンクを作成することができます。ls
の出力からシンボリックリンクを見つけるのはとても簡単です。
$ ls -lh total 112K -rw-r--r-- 1 carol carol 110K Jun 7 10:13 target.txt lrwxrwxrwx 1 carol carol 12 Jun 7 10:14 softlink -> target.txt
上の実行例において、softlink
ファイルのパーミッションの最初の文字は l
で、シンボリックリンクであることを示しています。さらに、さらに、ファイル名の後には、リンク先のターゲットの名前である target.txt
が表示されています。
ファイルやディレクトリの一覧では、ソフトリンク自体のパーミッションは、ユーザー宛、グループ宛、その他宛てのすべてについて rwx
ですが、実際にはターゲットのパーミッションと同じになります。
シンボリックリンクの移動と削除
ハードリンクと同様に、シンボリックリンクを rm
を使って移動したり、mv
を使ってリネームすることができます。ただし、元の位置から移動するときは、リンクを “壊さないよう” に十分な注意が必要です。
シンボリックリンクを作成する際には、ターゲットのパスがフルパス指定されない限り、リンクの場所からの 相対で 解釈されることに注意する必要があります。そのため、リンクやそれが指し示すファイルを移動すると問題が起きる可能性があります。
例を見るのが簡単でしょう。現在のディレクトリに original.txt
というファイルがあり、softlink
というシンボリックリンクを作成するとします。以下のコマンドを使用します:
$ ln -s original.txt softlink
うまくいくでしょうか。ls
で確認しましょう:
$ ls -lh total 112K -r--r--r-- 1 carol carol 110K Jun 7 10:13 original.txt lrwxrwxrwx 1 carol carol 12 Jun 7 19:23 softlink -> original.txt
リンクの構成に着目しましょう。softlink
が original.txt
を指し示して( →
)います。続いて、リンクを親ディレクトリに移動して、その内容を less
で表示すると、何が起きるかを見てみましょう:
$ mv softlink ../ $ less ../softlink ../softlink: No such file or directory
original.txt
へのパスが指定されていないので、システムはそれがリンクと同じディレクトリにあると想定します。想定が正しくないので、リンクは動作しません。
これを避ける方法は、リンクを作成するときにターゲットをフルパスで指定することです:
$ ln -s /home/carol/Documents/original.txt softlink
この方法では、ターゲットの絶対パスが指定されているので、リンクをどこに移動しても動作します。ls
で確認してみましょう:
$ ls -lh total 112K lrwxrwxrwx 1 carol carol 40 Jun 7 19:34 softlink -> /home/carol/Documents/original.txt
演習
-
あるプログラムが、終了後は決して必要としない1回限りの一時ファイルを作成する必要があるとします。そのファイルを作成する正しいディレクトリは何でしょう?
-
ブート中に必ずクリアしなくてならない一時ディレクトリは何でしょう?
-
ディレクトリにスティッキービットをセットする、
chmod
の シンボリック モードの引数は何ですか? -
/home/carol/Documents
ディレクトリにdocument.txt
というファイルがあるとします。現在のディレクトリにtext.txt
というシンボリックリンクを作成するコマンドは何ですか? -
ファイルへのハードリンクと、ファイルのコピーの違いを説明して下さい。
発展演習
-
あるディレクトリの中に
recipes.txt
というファイルを作り、同じディレクトリに、そのファイルを指すreceitas.txt
というハードリンクと、rezepte.txt
というシンボリックリンクを作成します。$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s recipes.txt rezepte.txt
ディレクトリの内容は次のようになるでしょう:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> receitas.txt
ハードリンク
receitas.txt
は、recipes.txt
と同じinodeを指すことに注意します。receitas.txt
を削除すると、シンボリックリンクrezepte.txt
には何が起きますか? それはなぜですか? -
フラッシュドライブをシステムにセットして
/media/youruser/FlashA
にマウントされたとします。フラッシュドライブのルートディレクトリにあるesquema.pdf
を指すschematics.pdf
というリンクをホームディレクトリに 作成したいとします。次のコマンドをタイプしました:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
何が起きますか? なぜですか?
-
次の
ls -lah
からの出力を考察します:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
いくつのリンクが、ファイル
document.txt
を指していますか? -
それらはハードリンクですか? ソフトリンクですか?
-
それぞれのファイルが占有している inodeを見るには、
ls
に何を指定しますか?
-
-
~/Documents
ディレクトリに、クライアントの名前を含むclients.txt
というファイルと、somedir
というディレクトリを作ります。そこには、別のクライアントの名前を含むclients.txt
という名前の 別の ファイルを置きます。次のコマンドで、その構造を作ります。$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
次に、
somedir
の中に、そのファイルを指すpartners.txt
というリンクを作ります:$ cd somedir/ $ ln -s clients.txt partners.txt
ディレクトリ構造は次のようになりました:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
次に、
partners.txt
をsomedir
から~/Documents
に移動して、内容を表示します。$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
このリンクは機能するでしょうか? 機能するとしたら、どのファイルの内容が表示されるでしょう? それは何故ですか?
-
以下のファイルについて考察します:
-rw-r--r-- 1 carol carol 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 carol carol 11 Jun 24 11:13 partners.txt -> clients.txt
partners.txt
のアクセスパーミッションはどうなりますか? なぜですか?
まとめ
このレッスンでは、次のような事柄を学習しました:
-
一時ファイルがどこにストアされるか
-
それらに適用される特別なパーミッション
-
リンクとは何か
-
シンボリックリンクとハードリンクの違い
-
リンクの作成方法
-
それらの移動、リネーム、削除方法
このレッスンでは、以下のコマンドを取り上げました:
-
ln
-
ls
の-i
オプション
演習の解答
-
あるプログラムが、終了後は決して必要としない1回限りの一時ファイルを作成する必要があるとします。そのファイルを作成する正しいディレクトリは何でしょう?
プログラムの実行が終了した後のファイルは関係ないので、正しいディレクトリは
/tmp
です。 -
ブート中に必ずクリアしなくてはならない一時ディレクトリは何でしょう?
/run
ディレクトリです。一部のシステムでは/var/run
のこともあります。 -
ディレクトリにスティッキービットをセットする、
chmod
の シンボリック モードの引数は何ですか?シンボリックモードにおけるスティッキービットのシンボルは
t
です。ディレクトリにこのパーミッションをセットしたいのですから、引数は+t
になります。 -
/home/carol/Documents
ディレクトリにdocument.txt
というファイルがあるとします。現在のディレクトリにtext.txt
というシンボリックリンクを作成するコマンドは何ですか?シンボリックリンクを作成するコマンドは
ls -s
です。リンクしたいファイルのパスをフルパスで指定する必要があるので、以下のコマンドになります:$ ln -s /home/carol/Documents/document.txt text.txt
-
ファイルへのハードリンクと、ファイルのコピーの違いを説明して下さい。
ハードリンクは、ファイルに対する別名です。元のファイルを複製したように見えますが、ディスク上の同じデータを指すので、すべての意味ででリンクと元のファイルは同じです。リンクの内容を変更すると元のファイルに反映されますし、逆も同様です。コピーした場合はディスク上の異なる位置を占有しますから、コピーへの変更は元のファイルに影響しませんし、逆も同様です。
発展演習の解答
-
あるディレクトリの中に
recipes.txt
というファイルを作り、同じディレクトリに、そのファイルを指すreceitas.txt
というハードリンクと、rezepte.txt
というシンボリックリンクを作成します。$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s recipes.txt rezepte.txt
ディレクトリの内容は次のようになるでしょう:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> recipes.txt
ハードリンク
receitas.txt
は、recipes.txt
と同じinodeを指すことに注意します。receitas.txt
を削除すると、シンボリックリンクrezepte.txt
には何が起きますか? それはなぜですか?ソフトリンク
rezepte.txt
は機能しなくなります。なぜなら、ソフトリンクが指すのは名前であり inodeではありません。なぜなら、ディスク上にデータがrecipes.txt
という名前で存在しますが、receitas.txt
という名前はもう存在しないからです。 -
フラッシュドライブをシステムにセットして
/media/youruser/FlashA
にマウントされたとします。フラッシュドライブのルートディレクトリにあるesquema.pdf
を指すschematics.pdf
というリンクをホームディレクトリに 作成したいとします。次のコマンドをタイプしました:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
何が起きますか? なぜですか?
コマンドは失敗します。エラーメッセージは
Invalid cross-device link
(デバイスにまたがる不正なリンク)で、理由は明白です。ハードリンクは、異なるデバイスやパーティションにあるターゲットを指し示すことができません。唯一の方法は、ln
に-s
オプションを追加して、シンボリックリンクを使用することです。 -
次の
ls -lah
からの出力を考察します:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
いくつのリンクが、ファイル
document.txt
を指していますか?すべてのファイルはリンクカウント
1
から始まります。ファイルのリンクカウントが4
なので、このファイルを指し示すリンクは3つです。 -
それらはハードリンクですか? ソフトリンクですか?
ハードリンクです。ソフトリンクは、ファイルのリンクカウントを増加させません。
-
それぞれのファイルが占有している inodeを見るには、
ls
に何を指定しますか?-i
オプションです。以下のように、ls
からの出力では最初のカラムに inode番号が表示されます:$ ls -lahi total 3,1M 5388773 drwxr-xr-x 2 rigues rigues 4,0K jun 17 17:27 . 5245554 drwxr-xr-x 5 rigues rigues 4,0K jun 17 17:29 .. 5388840 -rw-rw-r-- 1 rigues rigues 2,8M jun 17 15:45 compressed.zip 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 document.txt 5388837 -rw-rw-r-- 1 rigues rigues 216K jun 17 17:25 image.png 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 text.txt
-
-
~/Documents
ディレクトリに、クライアントの名前を含むclients.txt
というファイルと、somedir
というディレクトリを作ります。そこには、別のクライアントの名前を含むclients.txt
という名前の 別の ファイルを置きます。次のコマンドで、その構造を作ります。$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
次に、
somedir
の中に、そのファイルを指すpartners.txt
というリンクを作ります:$ cd somedir/ $ ln -s clients.txt partners.txt
ディレクトリ構造は次のようになりました:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
次に、
partners.txt
をsomedir
から~/Documents
に移動して、内容を表示します。$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
このリンクは機能するでしょうか? 機能するとしたら、どのファイルの内容が表示されるでしょう? それは何故ですか?
“トリッキー” ですが、リンクは機能します。表示されるファイルは、
~/Documents
にありJohn
やMichael
、Bob
を含むものです。ソフトリンク
partners.txt
を作る時にに、ターゲットclients.txt
へのフルパスを指定していないので、ターゲットの場所はリンクの位置からの相対パスとして解釈されます。リンクを
~/Documents/somedir
から~/Documents
に移動したときに、ターゲットがリンクと同じディレクトリではなくなって、リンクは無効になったはずです。しかしながら、たまたま~/Documents
にはclients.txt
というファイルがありましたから、リンクは元の~/somedir
にあるターゲットの代わりに、それを指し示すことになったのです。これを避けるためには、シンボリックリンクを作成する際に、ターゲットへのフルパスを指定します。
-
以下のファイルについて考察します:
-rw-r--r-- 1 rigues rigues 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 rigues rigues 11 Jun 24 11:13 partners.txt -> clients.txt
partners.txt
のアクセスパーミッションはどうなりますか? なぜですか?partners.txt
のパーミッションはrw-r—r--
です。リンクは常にターゲットのパーミッションを継承します。