※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

UnionFS情報

ソースからのコンパイル&インストール

  • /home/hoge/tmp/以下にunionfsのソース(使ってるカーネルのバージョンに合わせてunionfs 1.2)をダウンロードし、展開
    wget ftp://ftp.fsl.cs.sunysb.edu/pub/unionfs/unionfs-1.x/unionfs-1.2.tar.gz
    tar xfvz unionfs-1.2.tar.gz
    
  • これをコンパイルするが、unionfs-1.2/直下にfistdev.mkというファイルを生成。内容は以下の通り。共有してる資源上で行ったので、実行可能プログラム等は自分のホーム以下に置いた
    PREFIX = /home/hoge/software
    
    • PREFIXは実行可能ファイルを展開する先へのパスを表す。/lib/modules/`uname -r`/buildがちゃんとカーネルソースへのシンボリックリンクになってない、もしくはない場合は、このファイル内でパスを指定する
  • これでmakeするも、以下のようなエラーが出る
    # make
    ...
    In file included from unionimap.c:22:
    unionimap.h:29:23: uuid/uuid.h: No such file or directory
    unionimap.c: In function `create_forwardmap':
    unionimap.c:57: error: `uuid_t' undeclared (first use in this function)
    unionimap.c:57: error: (Each undeclared identifier is reported only once
    unionimap.c:57: error: for each function it appears in.)
    unionimap.c:57: error: syntax error before "uuid"
    unionimap.c:68: warning: implicit declaration of function `uuid_generate'
    unionimap.c:68: error: `uuid' undeclared (first use in this function)
    unionimap.c: In function `create_reversemap':
    unionimap.c:182: error: `uuid_t' undeclared (first use in this function)
    unionimap.c:182: error: syntax error before "uuid"
    unionimap.c:212: error: `uuid' undeclared (first use in this function)
    unionimap.c: In function `print_forwardmap':
    unionimap.c:305: warning: implicit declaration of function `uuid_unparse'
    make[1]: *** [unionimap] Error 1
    make[1]: Leaving directory `/home/hoge/tmp/unionfs-1.2/utils'
    make: *** [utils] Error 2
    
    • ググったところ、"uuid-dev" debianパッケージをインストールする必要があるらしい。。。のでapt get
      # apt-get install uuid-dev
      
    • するとなんとかコンパイルが通った!!
  • でも今できたのをインストールすることができない。。。Makefileの勉強をしてみよっと
  • unionfs-1.2/直下のMakefileにバグ発見っ!!以下のように変更
    install-utils: utils
            # make -C utils install PREFIX=${PREFIX}
            make -C utils install-utils PREFIX=${PREFIX}
            mkdir -p ${MANDIR}/man4
            mkdir -p ${MANDIR}/man8
            cp man/unionfs.4 ${MANDIR}/man4
            cp man/unionctl.8 ${MANDIR}/man8
            cp man/uniondbg.8 ${MANDIR}/man8
            cp man/unionimap.8 ${MANDIR}/man8
    
    • makeのオプション"-C"は、ディレクトリ移動を表し、サブディレクトリのutilsに移動してmake installを行うのだが、utils/のMakefileではinstallターゲットが無いっ!だから、それっぽいinstall-utilsに変えてあげた。
  • fistdev.mkで指定したディレクトリにunionfs-1.2というディレクトリを作成した後、union-fs-1.2/直下でmake installを実行
    $ mkdir /home/hoge/software/unionfs-1.2
    $ cd /home/hoge/tmp/unionfs-1.2
    # make install
    
    • これで無事にutilsとmodulesがインストールされた

実際に使ってみた

ディレクトリの重ね合わせ

  • 以下の実験を行った。まずは、2つのディレクトリを重ねていろいろいじってみる。mountに関してはオプションがちょっと独特なことに注意
    # cd /tmp
    # mkdir change_dir static_dir
    # cd change_dir
    # touch file1 file2
    # cd ../static_dir
    # touch static_file1 static_file2
    # mkdir static_subdir
    # cd /tmp
    # mount -t unionfs -o dirs=/tmp/change_dir/=rw:/tmp/static_dir/=ro unionfs /tmp/mnt
    # cd mnt/
    # ls 
    file1  file2  static_file1  static_file2  static_subdir <- 全部のファイルとディレクトリが見えてる
    # touch static_subdir/new_file1
    # vi static_file1 <--何かしらを書き込む
    # cd ..
    # umount /tmp/mnt
    
    • UnionFSのマウントのコマンドだけど、unionっちゃうディレクトリの順番はrw→roの順番じゃないと上手くマウントできない(parse error発生)。実装の問題っぽいけど、とりあえずこの順番に従うように
      # mount -t unionfs -o dirs=/tmp/change_dir/=ro:/tmp/static_dir/=rw unionfs /tmp/mnt/
      mount: wrong fs type, bad option, bad superblock on unionfs,
            missing codepage or other error
            In some cases useful info is found in syslog - try
            dmesg | tail  or so
      
  • umountでばらしたあとに、それぞれのディレクトリの中身をのぞく
    # ls static_dir/static_subdir/newfiles
    何もない...
    # cat static_dir/static_file1
    何も表示されない...
    # ls change_dir
    file1  file2  static_file1  static_subdir <- ファイルやらディレクトリやら増えてる
    # cat static_file1
    ****
    # ls static_dir/static_subdir
    new_file1
    
    • といった具合に、ro上に加えた変更点は全部rw上にコピーされて編集されている。これって差分だけ書いてるのか、それとも全部とりあえずコピーしちゃって、rwのファイルを編集してるのか気になった。
  • 誤解していたので書いておくと、unionfsはあくまでディレクトリの重ね合わせ。ファイル単体どうしの重ね合わせではない

-