Ubuntu 資料一覧

ループバックデバイスを用いて通常ファイルをファイルシステムとして使用する(XFS編)

2014/08/04更新

対応バージョン: 14.04

ファイルシステムを作る場合、普通は物理的なHDDや論理ボリュームなどを用意するが、一般的なファイルをループバックデバイスを用いてマウントすることで簡単にファイルシステムを作ることができる。

この方法は一時的にファイルシステム固有の仕様を調べる時などに便利である。

ここではext4上のファイルをXFSに仕立ててみる。

パッケージインストール

まずパッケージをインストールする。

% sudo apt-get install xfsprogs

これでファイルシステムを作成する/sbin/mkfs.xfsをはじめ、/sbinと/usr/sbinに各種管理ツール(xfs*)がインストールされる。

XFSのバックアップ/リストア用のコマンド(xfsdump/xfsrestore)を使いたい場合はxfsdumpパッケージもインストールする。

空ファイル作成

まずddで任意のサイズの空ファイルを作る(ここでは1MB x 100回 = 100MB)。

% cd /var/tmp

% dd if=/dev/zero of=dummy.xfs bs=1M count=100

% ls -l dummy.xfs
-rw-rw-r-- 1 neo neo 104857600  8月 04 13:40 dummy.xfs

% file dummy.xfs
dummy.xfs:  data

フォーマット

作成されたファイルをXFSでフォーマットする。

% mkfs -t xfs dummy.xfs
meta-data=dummy.xfs        isize=256    agcount=4, agsize=6400 blks
         =                 sectsz=512   attr=2, projid32bit=0
data     =                 bsize=4096   blocks=25600, imaxpct=25
         =                 sunit=0      swidth=0 blks
naming   =version 2        bsize=4096   ascii-ci=0
log      =internal log     bsize=4096   blocks=1200, version=2
         =                 sectsz=512   sunit=0 blks, lazy-count=1
realtime =none             extsz=4096   blocks=0, rtextents=0

% file dummy.xfs
dummy.xfs: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

マウント

ループバックデバイスを用いてマウントする。

% sudo mkdir /mnt/xfs

% sudo mount -t xfs -o loop dummy.xfs /mnt/xfs

% sudo chmod 1777 /mnt/xfs

% mount | grep xfs
/var/tmp/dummy.xfs on /mnt/xfs type xfs (rw)

% df /mnt/xfs
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/loop0         97600  5280     92320   6% /mnt/xfs

% df -i /mnt/xfs
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/loop0     102400     3 102397    1% /mnt/xfs

% xfs_info /mnt/xfs
meta-data=/dev/loop0       isize=256    agcount=4, agsize=6400 blks
         =                 sectsz=512   attr=2
data     =                 bsize=4096   blocks=25600, imaxpct=25
         =                 sunit=0      swidth=0 blks
naming   =version 2        bsize=4096   ascii-ci=0
log      =internal         bsize=4096   blocks=1200, version=2
         =                 sectsz=512   sunit=0 blks, lazy-count=1
realtime =none             extsz=4096   blocks=0, rtextents=0

尚、ループバックデバイスが使えるかどうかは/proc/devicesを見ればよい。左の番号はデバイスのメジャー番号である。

% cat /proc/devices 
:
Block devices:
:
  7 loop
:

% ls -l /dev/loop?
brw-rw---- 1 root disk 7, 0  8月  4 15:59 /dev/loop0
brw-rw---- 1 root disk 7, 1  8月  4 13:20 /dev/loop1
brw-rw---- 1 root disk 7, 2  8月  4 13:20 /dev/loop2
brw-rw---- 1 root disk 7, 3  8月  4 13:20 /dev/loop3
brw-rw---- 1 root disk 7, 4  8月  4 13:20 /dev/loop4
brw-rw---- 1 root disk 7, 5  8月  4 13:20 /dev/loop5
brw-rw---- 1 root disk 7, 6  8月  4 13:20 /dev/loop6
brw-rw---- 1 root disk 7, 7  8月  4 13:20 /dev/loop7

テスト

ここではXFS特有の機能をいくつか使ってみる。

ファイルシステム一時停止

xfs_freezeコマンドによりファイルシステムを一時停止させることができる。

% sudo xfs_freeze -f /mnt/xfs

この状態で何かファイルを作ったり更新したりしようとしても待たされる。

% touch /mnt/xfs/test <- 待たされる

一時停止を解除すれば待たされていた処理は実行される。

% sudo xfs_freeze -u /mnt/xfs
バックアップ、リストア

バックアップとリストアにはxfsdumpとxfsrestoreを使用する。

まずバックアップを試してみる。

-lオプションでダンプレベル(0-9)を指定し、-fオプションでバックアップ先デバイスを指定する(ファイルも可)。

% sudo xfsdump -l 0 -f backup.dmp /mnt/xfs
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.1 (dump format 3.0) - type ^C for status and control

 ======================= dump label dialog ========================

please enter label for this dump session (timeout in 300 sec)
 -> full backup <- 任意のラベル名を付ける
session label entered: "full backup"

 --------------------------- end dialog ---------------------------

xfsdump: level 0 dump of k1:/mnt/xfs
xfsdump: dump date: Mon Aug  4 16:13:59 2014
xfsdump: session id: d2c67c66-e997-4de8-87a9-d912bdecbc6f
xfsdump: session label: "full backup"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 21120 bytes
xfsdump: /var/lib/xfsdump/inventory created

 ======================= media label dialog =======================

please enter label for media in drive 0 (timeout in 300 sec)
 -> full backup media <- 任意のメディアラベル名を付ける
media label entered: "full backup media"

 --------------------------- end dialog ---------------------------

xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 21328 bytes
xfsdump: dump size (non-dir files) : 0 bytes
xfsdump: dump complete: 62 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /var/tmp/backup.dmp OK (success)
xfsdump: Dump Status: SUCCESS

% ls -l /var/tmp/backup.dmp
-rw-r--r-- 1 root root 21328  8月  4 16:15 /var/tmp/backup.dmp

% file /var/tmp/backup.dmp
/var/tmp/backup.dmp: xfsdump archive (version 3)

バックアップ情報は/var/lib/xfsdump/inventory配下に保存される。内容を確認するにはxfsrestoreの-Iオプションを使用する。

% xfsrestore -I
file system 0:
    fs id:              252b9f88-d7a3-455b-918d-992c92cc0407
    session 0:
        mount point:    k1:/mnt/xfs
        device:         k1:/dev/loop0
        time:           Mon Aug  4 16:13:59 2014
        session label:  "full backup"
        session id:     d2c67c66-e997-4de8-87a9-d912bdecbc6f
        level:          0
        resumed:        NO
        subtree:        NO
        streams:        1
        stream 0:
            pathname:       /var/tmp/backup.dmp
            start:          ino 131 offset 0
            end:            ino 132 offset 0
            interrupted:    NO
            media files:    1
            media file 0:
                mfile index:    0
                mfile type:     data
                mfile size:     21328
                mfile start:    ino 131 offset 0
                mfile end:      ino 132 offset 0
                media label:    "full backup media"
                media id:       bcbe47ed-258c-4e40-8449-7ffa7fff3269
xfsrestore: Restore Status: SUCCESS

このバックアップ情報を削除するには単に/var/lib/xfsdump/inventoryをディレクトリ毎削除すればよい。

次にリストアを試してみる。

上記で確認したようにバックアップ毎にsession idが一意に付与されるので、リストア時にはこのsession idを指定する。

% rm /mnt/xfs/test <- 最初に作ったテストファイルを削除する

% sudo xfsrestore -f /var/tmp/backup.dmp -S d2c67c66-e997-4de8-87a9-d912bdecbc6f -r /mnt/xfs
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.1 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 1 directories and 1 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /var/tmp/backup.dmp OK (success)
xfsrestore: Restore Status: SUCCESS

% ls -l /mnt/xfs
-rw-rw-r-- 1 neo  neo   0  8月  4 16:11 test
drwx------ 2 root root 73  8月  4 16:23 xfsrestorehousekeepingdir/

リストア前に削除したファイルが復元されていること、また管理情報を格納するためのxfsrestorehousekeepingdirディレクトリが作成されている。

% sudo ls -l /mnt/xfs/xfsrestorehousekeepingdir
-rw------- 1 root root     4152  8月  4 16:23 dirattr
-rw------- 1 root root        0  8月  4 16:23 dirextattr
-rw------- 1 root root     4111  8月  4 16:23 namreg
-rw------- 1 root root    24576  8月  4 16:23 state
-rw------- 1 root root 58753024  8月  4 16:23 tree

その他、XFSにはいろいろな機能があるがここでは割愛する。