ファイルシステムと書庫

INPUT · スライド

近道を作る(`ln -s`)

01 / 07

「あっちを見て」と書いた紙

前の回で見たこれを、もう一度見てみよう。

~ $ ls -l /bin/lslrwxrwxrwx  1 root root  7  /bin/ls -> busybox

/bin/ls の中身は ls のプログラムではなかったね。busybox を見て」と書いた紙なんだ。

これを シンボリックリンク(symbolic link)と呼ぶよ。「シンボリック」は「記号の」という意味で、短くシムリンクとも言うね。

作り方はこうだよ。

~ $ ln -s moto.txt link.txt~ $ cat link.txthello              ← moto.txt の中身が出る

ln は link の略、-s は symbolic の s だよ。

順番に気をつけてね。

ln -s 指し先 作る名前      ↑      ↑   本物    紙(新しく作るほう)

cp と同じ並びだと思えばいいよ。「元 → 新しい名前」の順だね。

02 / 07

中身は持っていない

リンクは中身を持たないよ。持っているのは「指し先の文字」だけなんだ。

~ $ readlink link.txtmoto.txt

readlink は「その紙に何と書いてあるか」を教えてくれるコマンドだよ。

だから、こういうことが起きるんだ。

リンクを消す   → 本体は無事(紙を捨てただけ)本体を消す     → リンクは残るが、迷子になる

2つめが大事だよ。指し先が無くなっても、リンクは平気な顔で残るんだ。

~ $ rm moto.txt~ $ cat link.txtcat: can't open 'link.txt': No such file or directory

link.txt はあるのに「無い」と言われるでしょう。紙はあるが、行った先に何も無いという状態だね。これを 壊れたリンク(dangling link)と呼ぶよ。

ls では見た目が変わらないので、気づきにくいところなんだ。

03 / 07

ディレクトリへの近道にもなる

リンクの指し先はファイルでなくてもいいよ。ディレクトリも指せるんだ。

~ $ ln -s fukai/naka chikamichi~ $ ls chikamichidata.txt~ $ cat chikamichi/data.txtoku

深い場所への近道ができたね。

fukai/naka/data.txt      本来の道chikamichi/data.txt      近道

毎日通う場所が深いところにあるなら、部屋の入口に近道を1つ置いておくと楽だよ。

cd もできるよ。

~ $ cd chikamichi~/chikamichi $ pwd/home/manabiya/chikamichi     ← 通ってきた道~/chikamichi $ pwd -P/home/manabiya/fukai/naka     ← 本当の場所

pwd は「あなたが通ってきた道」を見せ、-P(physical)は「実際の場所」を見せるんだ。近道を通っていることを忘れたときに、pwd -P で確かめられるね。

04 / 07

相対で指すか、絶対で指すか

ここは間違いのもとになるところだよ。指し先の書き方が2つあるんだ。

ln -s moto.txt link.txt                   相対(同じ場所の moto.txt)ln -s /home/manabiya/moto.txt link.txt    絶対(この道の moto.txt)

相対で書いたリンクは、リンクの置かれた場所から見た道順を覚えているよ。だからリンクを動かすと壊れるんだ。

~ $ mv link.txt hako/~ $ cat hako/link.txtcat: can't open ... No such file or directory

hako の中には moto.txt が無いからね。紙に「同じ場所の moto.txt を見て」と書いてあるので、引っ越したら指す先も変わってしまったんだ。

使い分けはこうだよ。

書き方向いている場面
相対リンクと本体をまとめて動かすとき
絶対リンクだけを動かすかもしれないとき

迷ったら絶対で書くのが安全だね。長くなるけれど、動かしても壊れないよ。

05 / 07

-f で貼り替える

リンクの本当のうれしさは、貼り替えられることだよ。

~ $ ln -s v1.txt ima.txt      ima.txt は v1 を指す~ $ ln -sf v2.txt ima.txt     貼り替えて v2 を指す

-f(force)は「もうその名前があっても上書きする」という印だよ。付けないと File exists と言われるんだ。

この形が実務で本当によく出てくるよ。

app-1.0.0/     古い版app-1.1.0/     新しい版app -> app-1.1.0    ← いま動かす版を指す

使うほうはいつも app と書けばいい。中身を入れ替えるときはリンクを貼り替えるだけ。もし新しい版で問題が起きたら、リンクを戻せば元に戻るね。

入れ替えが一瞬で終わる戻すのも一瞬

ファイルを何 GB もコピーし直す必要が無いんだ。「名前だけを付け替える」という発想だよ。

06 / 07

リンクを見つける・辿る

道具をまとめておこう。

ln -s 指し先 名前     作るln -sf 指し先 名前    貼り替えるreadlink 名前         書いてある指し先を見るreadlink -f 名前      辿った先の本当の場所を見るfind . -type l        リンクだけを並べるrm 名前               リンクを消す(本体は無事)

readlink の2つの形を並べておくね。

~ $ readlink /bin/lsbusybox              ← 書いてあるまま~ $ readlink -f /bin/cat/bin/busybox         ← 辿った先の絶対パス

find . -type l は掃除のときに使うよ。-type f(ふつうのファイル)や -type d(ディレクトリ)は章3でやったね。l を足すとリンクだけが出る。

消すときの注意を1つだけ。

rm link            リンクを消す(正しい)rm link/           ディレクトリへのリンクだと怒られることがある

最後に / を付けないのが安全だよ。付けると「中身のほう」を指してしまうんだ。

07 / 07

さあ、打ってみよう

この回で作るものを、絵にしておくね。

moto.txt      hello と書いてある本体link.txt ──→  moto.txt を見て、と書いた紙

覚えることは3つだけだよ。

1. ln -s で作る(元 → 新しい名前の順)2. 中身は持っていない(指し先が消えたら迷子)3. ln -sf で貼り替えられる

練習では、わざと壊れたリンクも作るからね。うまくいかない形を先に見ておくと、本物の現場で「なぜかファイルが無いと言われる」に出会ったときに、すぐ気づけるようになるよ。

次の回では、もう1種類のリンク(ハードリンク)をやるよ。そちらは紙ではなく、同じ中身に付いた2つめの名前なんだ。今回の性質と比べると、違いがはっきり分かるからね。