ディレクトリをディレクトリにマウントする

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$ 

アクセス時刻が更新されました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA