「さまざまなマウントたち」の編集履歴(バックアップ)一覧に戻る

さまざまなマウントたち - (2011/05/15 (日) 09:16:19) のソース

mountコマンドのmanを見ると、非常に説明が長く、mountコマンドで色々なことができる。
ここでは、たまに使いたいときがあるけど、すぐ忘れてしまうmountコマンドの使い方を書いておく。

#contents()

**基本のコマンド-リスト
> mount [-t vfstype] device dir

サポートされているファイルシステムタイプは以下のとおり。
> vfstype :adfs, affs, autofs, coda,  coherent,  cramfs,  devpts,  efs, ext, ext2, ext3,
>      hfs, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs,  ntfs,
>      proc,  qnx4,  ramfs, reiserfs, romfs, smbfs, sysv, tmpfs,
>      udf, ufs, umsdos, usbfs, vfat, xenix, xfs, xiafs


**CD、DVDのマウント
以下のようにしてマウントする。-t オプションは指定しなくても自動で認識してくれる。mountのmanを見ると、DVDはiso9660の他に、udfというファイルシステムタイプもあるようだが、手元のDVDをいくつかためしてみが、udfではマウントできず、すべてiso9660だった。
なお、-r はCD-ROM、DVD-ROMだと、リードオンリーでマウントしないと警告メッセージがでるため。
> mount [-t iso9660] [-r] /dev/cdrom dir
> mount [-t iso9660] [-r] /dev/dvd dir
> mount [-t iso9660] [-r] /dev/sr0 dir      <ーー/dev/cdrom と /dev/dvd は、/dev/sr0のシンボリックリンク


**ループバック(loopback)デバイスのマウント
ループバックデバイスとは、任意のファイルを、ファイルシステムのようにマウントする機能。
ただし、ファイルを作成しただけではマウントできず、losetupコマンドを使ってファイル内にファイルシステムの作成が必要。
ファイルシステムを作成したファイルは、以下のようにしてマウントできる。
> mount file dir [-t vfstype] -o loop=/dev/loop?  <ーー/dev/loop?がloopbackデバイス。ubuntuではloop0~loop7

10MBのファイルを作成し、それを ext3 としてマウントするには、以下のようにする。
> $ dd if=/dev/zero of=./testfile count=10 bs=1024k  <ーー10MBのファイルを作成
> $ ls -l testfile
> -rw-r--r-- 1 usr grp 10485760 2010-06-27 00:02 testfile
> $ sudo losetup -f                  <ーー最初の未使用loopbackデバイスの表示
> /dev/loop0
> $ sudo losetup /dev/loop0 ./testfile         <ーーloopbackデバイスに作成したファイルを接続
> $ sudo mkfs -t ext3 /dev/loop0            <ーーloopbackデバイスを通して、testfile上にファイルシステム作成
> $ sudo mount -t ext3 /dev/loop0 tmp         <ーーtmpにloopbackデバイスをマウント
> $ mount | grep loop0
> /dev/loop0 on /home/ISO/tmp type ext3 (rw)
> $ df -m
> ファイルシステム           1M-ブロック    使用   使用可 使用% マウント位置
>   ・・・途中略 ・・・
> /dev/loop0                  10         2         9  12% /home/tmp   <ーー確かに10MBのサイズでマウントされている。
> $ sudo umount tmp
> $ sudo losetup -d /dev/loop0               <ーーtestfileのloopbackデバイスへの接続を切断
> $ sudo losetup /dev/loop0
> loop: デバイス /dev/loop0 の情報を取得できません: No such device or address  <ーー切断されているため

ファイルとloopbackデバイスが接続済みなら、「mount loopbackデバイス dir」でマウントできるが、未接続なら以下のようにすることで、マウント時に一時的に接続してマウントできる。一時的なので、umountすると接続が切れる。()
> $ sudo mount -t ext3 testfile tmp -o loop=/dev/loop0
> $ mount | grep loop
> /dev/loop0 on /home/ISO/tmp type ext3 (rw,loop=/dev/loop0)
> $ sudo umount tmp  
> loop: デバイス /dev/loop0 を削除できません: No such device or address  <ーー一時的なせいかエラーがでるが、アンマウントできる。

上記では、未使用のloopbackデバイスを探してからtestfileを接続したが、以下のようにすると未使用のものに接続してくれる。
ただ、接続時にどのloopbackデバイスに接続したか表示されないので、結局どれに接続されたか調べる必要がある。
> $ sudo losetup -f ./testfile                         <ーー最初の未使用loopbackデバイスに作成したファイルを接続
> $ sudo losetup /dev/loop0
> /dev/loop0: [0803]:918611 (/home/ISO/testfile)

ループバックデバイスを使うなら、1度はlosetupコマンドのmanをみるべき。
なお、losetupに -E や -e オプションがあり、暗号化モジュールが組み込まれていれば、loopbackデバイス上のファイルシステムを暗号化出きる模様(試してない)。セキュリティ要件が厳しいファイルがある場合に、loopbackデバイスを使って暗号化したファイルシステムを作って、そこにファイルを格納するなどの使い方に便利かと。

loopbackデバイスの個数は以下で確認できる。
> $ cat /proc/devices | grep loop
> 7 loop

loopbackデバイスを増やす場合は以下のようにする。
Novellの[[http://support-j.novell.co.jp/tid/jp/00007000_/00007004.htm]]にでていた方法でSuSE用。Ubuntuでは実際にためしてないのであしからず。
 1./etc/modprobe.d/loopファイルを作成
   例えば、20個にしたい場合、次のようにloopデバイスの個数を指定します。
   options loop max_loop=20

   [[http://d.hatena.ne.jp/KoshianX/20080712/1215867901]]によれば、ubuntuの場合はファイル名が
  違うようで、以下のようにすればよいようです。
> $ sudo echo 'options loop max_loop=255' >/etc/modprobe.d/loopdev 

 2. /dev/loopデバイスを必要な数だけ作成します。
  /dev/loop0から/dev/loop7までは存在するので、以下のように/dev/loop19まで作成します。

> for NODE in $(seq 8 19)
> do
> mknod -m 660 /dev/loop$NODE b 7 $NODE
> done
> chown root:disk /dev/loop*

 3. OSを再起動します。 


**ISOイメージのマウント
CD-ROMやDVD-ROMのISOイメージは、iso9660というファイルシステムをもった1つのファイルである。なので、上記のループバックデバイスを使うと、ISOイメージがマウントできる。
> $ sudo mount -t iso9660 -r  pclinuxos-2009.1-jp.iso ./tmp -o loop=/dev/loop0
> $ mount | grep loop
> /dev/loop0 on /home/tomonari/ISO/tmp type iso9660 (ro,loop=/dev/loop0)
> $ sudo losetup /dev/loop0
> /dev/loop0: [0803]:815467 (/home/tomonari/ISO/pclinuxos-2009.1-jp.iso)

 
**任意のディレクトリを任意のディレクトリにマウントする。(Linux 2.4.0 以降)
以下のようにすると、olddirをnewdirにマウントできる。
ファイルシステムのマウントオプションは、元のマウントポイントのものが敬称され、--bind/--rbind の後に -o オプションを指定して変更できない
> mount --bind olddir newdir     <ーolddir内のサブマウントはアタッチされない。
> mount --rbind olddir newdir     <ーolddir内のサブマウントもアタッチされる。

例:
> $ ls -l tmp
> 合計 4
> -rw-r--r-- 1 usr grp    0 2010-06-26 23:02 fff
> drwxr-xr-x 2 usr grp 4096 2010-06-26 23:02 ttt
> $ ls -l tmp2
> 合計 0         <ーーここには何もない。
> $ sudo mount --bind ./tmp ./tmp2
> $ ls -l tmp
> 合計 4         <ーーもとのディレクトリでもアクセス可能
> -rw-r--r-- 1 usr grp    0 2010-06-26 23:02 fff
> drwxr-xr-x 2 usr grp 4096 2010-06-26 23:02 ttt
> $ ls -l tmp2
> 合計 4         <ーー新たなマウント先でも同じ内容にアクセス可能
> -rw-r--r-- 1 usr grp    0 2010-06-26 23:02 fff
> drwxr-xr-x 2 usr grp 4096 2010-06-26 23:02 ttt


**マウント済みマウントポイントを別のマウントポイントに移動(Linux 2.5.1 以降)
man上は「マウントされたツリーを纏めて他の場所に移動する」とある機能で、以下のようにする。
ためしたところだと、olddirにマウントされているのアンマウントして、アンマウントしたものをnewdirにマウントしなおす機能。
> mount --move olddir newdir

特にファイルシステム(デバイスファイル)でなくても、上記の --bind や --rbind でマウントした単なるディレクトリであっても、mountでマウントしたものなら移動可能な模様。
なお、移動なのでマウント後は、olddir配下には何もマウントされておらず、newdirをアンマウントしてもolddirはアンマウントされたままだった。

例:
> $ mount | grep tmp2
> /home/tmp on /home/tmp2 type none (rw,bind)  <ーーtmp2にマウントされている
> $ ls -l tmp3
> 合計 0                    <ーーtmp3には何もマウントされていない。
> $ ls -l tmp2
> 合計 4
> -rw-r--r-- 1 usr grp    0 2010-06-26 23:02 fff
> drwxr-xr-x 2 usr grp 4096 2010-06-26 23:02 ttt
> $ sudo mount --move ./tmp2 ./tmp3
> $ ls -l tmp2
> 合計 0                    <ーーtmp2にはマウントされていない。
> $ ls -l tmp3
> 合計 4                    <ーーtmp3にマウントされている。
> -rw-r--r-- 1 usr grp    0 2010-06-26 23:02 fff
> drwxr-xr-x 2 usr grp 4096 2010-06-26 23:02 ttt


**tmpfs - メモリをファイルシステムとしてマウントする
以下のようにすると、メモリの一部をファイルシステムとして任意のディレクトリにマウントできます。
> mount -t tmpfs tmpfs dir [-o size=XXX] 

メモリ上なので、高速に読み書きできるが、アンマウントしたり、リブートするとその中のファイルはなくなる。
ファイルシステム内のファイル量に応じて、動的にメモリが割り当てられ、中のファイルを削除するとメモリが開放される、仮想メモリ上に構築されているため、物理メモリが不足すると、仮想メモリが使われる。
メモリを使い尽くすことの対策として、ファイルシステムの容量を size オプションにより指定できる。

例
> $ sudo mount -t tmpfs -o size=64m tmpfs ./tmp2  <ーー64MBの容量でtmp2にマウント sizeの単位はg,m,k
> $ mount | grep tmp2
> tmpfs on /home/tomonari/tmp2 type tmpfs (rw,size=64m)  <ーーマウントされている

なお、tmpfsについては、[[仮想記憶(VM)ファイルシステムとバインド・マウントの使い方>http://www.ibm.com/developerworks/jp/linux/library/l-fs3/]]が詳しい。
また、tmpfsの正式なマウントポイントは /dev/shm で、Ubuntu10.04もデフォルトでマウントされています。


**aufs(Another UnionFS) ー 複数のディレクトリを重ね合わせる。
UnionFSは、複数のディレクトリを重ね合わせて、それらのディレクトリの和集合を合成するファイルシステム。
aufsとは、UnionFSの信頼性と性能改善を狙って開発されたものである。
以下のようにして、ディレクトリを重ね合わせられる。マウント元が none なのは、重ね合わせたディレクトリがマウント元であり、オプションとして指定しているので、マウント元としては指定しなくてよい(常にnoneでよい)。また、mountdirは重ね合わせたディレクトリと同じでも別でもよい。(別にした場合は、mountdir配下に合ったファイルやディレクトリは見えなくなる。) 
> mount -t aufs -o br:dir1:dir2:dir3:... none mountdir

例:
> $ ls tmp*   複数のtmp?ディレクトリを作成し、ファイルを入れておく。
> tmp:
> dir1  file1
> 
> tmp2:
> file2
> 
> tmp3:
> file3
> 
> tmp4:
> file4
> 
> tmp5:
> file5
> $ sudo mount -t aufs -o br:./tmp:./tmp2:./tmp3:./tmp4 none ./tmp5   <ーーtmp5に、tmp、tmp2、tmp3,tmp4を重ね合わせたものをマウント
> $ mount | grep tmp5
> none on /home/tomonari/tmp5 type aufs (rw,br:./tmp:./tmp2:./tmp3:./tmp4)
> $ ls ./tmp?
> ./tmp:     <ーー重ね合わせても、もとのディレクトリでもアクセスできる。
> dir1  file1
> 
> ./tmp2: 
> file2
> 
> ./tmp3:
> file3
> 
> ./tmp4:
> file4
> 
> ./tmp5:
> dir1  file1  file2  file3  file4  <ーー重ね合わせたディレクトリのファイルが見える。

aufs配下のファイルに書き込んだり削除した場合の動きを確認してみる。
> $ echo "add string" > ./tmp5/newfile  <ーー新規ファイルに書き込み
> $ echo "add existed" > ./tmp5/file3  <ーー既存のファイルに書き込み
> $ ls ./tmp*
> ./tmp:
> dir1  file1  file3  newfile      <ーー一番最初に、file3もnewfile3も作成されている。
> 
> ./tmp2:
> file2
> 
> ./tmp3:
> file3
> 
> ./tmp4:
> file4
> 
> ./tmp5:
> dir1  file1  file2  file3  file4  newfile  <ーーnewfileはここにもできている。
> $ cat ./tmp3/file3          <ーーもとのtmp3配下のfile3にはかかれていない。
> $ cat ./tmp5/file3          <ーーあらたに作成されたfile3にはかかれている。
> add existed
> $ rm tmp5/file3
> $ ls tmp*
> tmp:
> dir1  file1  newfile         <ーーfile3は消えている。
> 
> tmp2:
> file2
> 
> tmp3:
> file3                 <ーーfile3は残っている。
> 
> tmp4:
> file4
> 
> tmp5:
> dir1  file1  file2  file4  newfile  <ーーfile3は消えている。

削除とか、他にも色々確認んしてみたいことはあるが、それはまたそのうち。
LiveCDのLinuxなどで、CD-ROMは書き込み不可にも関わらず、ファイルを作成できたりするのは、このUnionFSやaufs上にtmpfsを重ね合わせて、CD-ROM上のファイルツリーを見せつつ、メモリ上に書き込み可能にしているからである。

**cifs(Common Internet File System) - Windowsのフォルダ(sammbaも)をマウントする
昔は、sambaの共有ディレクトリをLinuxのマシンからマウントする場合は、smbmountコマンドを使ったのだが、RHEL5.4にはそのコマンドがなくなっていた。調べてみると、今はmountコマンドの-tオプションに「cifs」を指定するらしい。

> mount -t cifs  //<ホスト名>/public /mnt/samba -o  rw,username=<ユーザID>, \
>                                iocharset=utf8,file_mode=0777,dir_mode=0777

----
#comment()

----