「mountコマンドに慣れる」では、マウントが失敗していましたが、–bindオプションを指定することで、デバイスの代わりに、ディレクトリを、マウントすることができます。
man mountの–bindの説明箇所を読んでおきます。
Linux 2.4.0 以降では、 ファイル階層の一部をどこか別の場所に再マウントす ることができる。 使い方は以下の通りである。 mount --bind olddir newdir この呼び出しの後、同じ内容を 2 つの場所でアクセスできる。 1 つのファイ ルを (1 つのファイル上に) 再マウントすることもできる。 この呼び出しでは 1 つのファイルシステム (の一部) のみをアタッチするだけ で、 サブマウントはアタッチしない。 サブマウントを含むファイル階層全体 は、 以下のコマンドで 2 番目の場所にアタッチできる。 mount --rbind olddir newdir ファイルシステムのマウントオプションは、 元のマウントポイントのものと同 じに維持され、 --bind/--rbind の後に -o オプションを指定して変更できな い点に注意すること。
ディレクトリa、bを使って確認してみましょう。
takk@deb9:~/tmp$ ls takk@deb9:~/tmp$ mkdir a b takk@deb9:~/tmp$ sudo mount --bind a b
これでディレクトリbは、aをマウントしました。
lsで権限を確認してみます。
takk@deb9:~/tmp$ ls -l 合計 8 drwxr-xr-x 2 takk takk 4096 6月 24 17:55 a drwxr-xr-x 2 takk takk 4096 6月 24 17:55 b takk@deb9:~/tmp$
loopデバイスの時は、rootに変わりましたが、今回は変わってません。
ディレクトリbは、マウントポイントになっているのでしょうか。
takk@deb9:~/tmp$ mountpoint b b is a mountpoint takk@deb9:~/tmp$
マウントポイントになっているということで、マウント成功しているようですね。
では、ディレクトリaの中にファイルを作成して、bから参照できるか確認してみましょう。
takk@deb9:~/tmp$ echo HELLO >a/file1 takk@deb9:~/tmp$
ディレクトリaとbを、lsしてみます。
takk@deb9:~/tmp$ ls -l */* -rw-r--r-- 1 takk takk 6 6月 24 17:56 a/file1 -rw-r--r-- 1 takk takk 6 6月 24 17:56 b/file1 takk@deb9:~/tmp$
bの中にも同じタイムスタンプのファイル file1ができてます。
それぞれをstatしてみます。
takk@deb9:~/tmp$ stat */* File: a/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 17:56:50.295003999 +0900 Modify: 2018-06-24 17:56:50.295003999 +0900 Change: 2018-06-24 17:56:50.295003999 +0900 Birth: - File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 17:56:50.295003999 +0900 Modify: 2018-06-24 17:56:50.295003999 +0900 Change: 2018-06-24 17:56:50.295003999 +0900 Birth: - takk@deb9:~/tmp$
ディレクトリbのファイルをcatすると、両方のアクセス時刻が更新されるでしょうか。
takk@deb9:~/tmp$ cat b/file1 HELLO
takk@deb9:~/tmp$ stat */* File: a/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 17:58:31.479003999 +0900 Modify: 2018-06-24 17:56:50.295003999 +0900 Change: 2018-06-24 17:56:50.295003999 +0900 Birth: - File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 17:58:31.479003999 +0900 Modify: 2018-06-24 17:56:50.295003999 +0900 Change: 2018-06-24 17:56:50.295003999 +0900 Birth: - takk@deb9:~/tmp$
まったく同じタイムスタンプですね。同じものなので当たり前ですが。
ディレクトリbを、アクセス時刻非更新の設定(noatime)にすることはできるでしょうか。
–bindに加えて、-o noatimeも指定してみます。
takk@deb9:~/tmp$ sudo mount --bind -o noatime a b takk@deb9:~/tmp$
今格納しているファイルのタイムスタンプを一旦今の時刻にすべて合わせます。
takk@deb9:~/tmp$ touch a/file1 takk@deb9:~/tmp$ stat */* File: a/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:00:37.631003999 +0900 Modify: 2018-06-24 18:00:37.631003999 +0900 Change: 2018-06-24 18:00:37.631003999 +0900 Birth: - File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:00:37.631003999 +0900 Modify: 2018-06-24 18:00:37.631003999 +0900 Change: 2018-06-24 18:00:37.631003999 +0900 Birth: - takk@deb9:~/tmp$
ディレクトリbで、file1をcatします。
takk@deb9:~/tmp$ cat b/file1 HELLO takk@deb9:~/tmp$
statを確認。アクセス時刻は更新されないはず。。。
takk@deb9:~/tmp$ stat b/file1 File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:01:08.367003999 +0900 Modify: 2018-06-24 18:00:37.631003999 +0900 Change: 2018-06-24 18:00:37.631003999 +0900 Birth: - takk@deb9:~/tmp$
更新されてます。おかしいです。
mountがnoatimeで設定されているか確認してみます。
takk@deb9:~/tmp$ mount | grep tmp/b /dev/sda1 on /home/takk/tmp/b type ext4 (rw,relatime,errors=remount-ro,data=ordered) takk@deb9:~/tmp$
relatimeで設定されています。
(実はrelatimeって何だろう?(それ以外の箇所も)と思ってますが、いろいろな方向へ脱線し始めると、結局学習の時間ロスになるので、今回は、おそらくnoatimeの逆の意味だろうと、仮定しています。本当の意味はそのうち調べます)
man mountを読み返すと、noatimeは、remountで指定する必要があることがわかりました。
では、アンマウントして、マウントからやり直し。
takk@deb9:~/tmp$ sudo umount b takk@deb9:~/tmp$ sudo mount --bind a b takk@deb9:~/tmp$ sudo mount -o remount,noatime a b takk@deb9:~/tmp$ mount | grep tmp/b /dev/sda1 on /home/takk/tmp/b type ext4 (rw,noatime,errors=remount-ro,data=ordered) takk@deb9:~/tmp$
mountのgrep結果を見ると、relatimeが、noatimeに変わってますね。
では、再度ディレクトリbのファイルをcatして、アクセス時刻を確認してみます。
takk@deb9:~/tmp$ touch a/file1 takk@deb9:~/tmp$ stat b/file1 File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:16:12.503003999 +0900 Modify: 2018-06-24 18:16:12.503003999 +0900 Change: 2018-06-24 18:16:12.503003999 +0900 Birth: - takk@deb9:~/tmp$
まずは、各タイムスタンプを同じ時刻に合わせます。
bからアクセスします。
takk@deb9:~/tmp$ cat b/file1 HELLO takk@deb9:~/tmp$ stat b/file1 File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:16:12.503003999 +0900 Modify: 2018-06-24 18:16:12.503003999 +0900 Change: 2018-06-24 18:16:12.503003999 +0900 Birth: - takk@deb9:~/tmp$
アクセス時刻は更新されてません。期待通りです。
aからアクセスすると、
takk@deb9:~/tmp$ cat a/file1 HELLO takk@deb9:~/tmp$ stat b/file1 File: b/file1 Size: 6 Blocks: 8 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 814612 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-06-24 18:17:01.231003999 +0900 Modify: 2018-06-24 18:16:12.503003999 +0900 Change: 2018-06-24 18:16:12.503003999 +0900 Birth: - takk@deb9:~/tmp$
アクセス時刻が更新されました。
コメント