hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ファイルシステムコマンドの使い方



1 はじめに

ext4,xfsファイルシステムで使用するコマンドの概要についてまとめました。お手軽に試すため、ループバックデバイスを使って、コマンドの使い方を確認してみます。

2 環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 コマンド一覧

xt4,xfsファイルシステムで使用するコマンドを以下に示します。

ファイルシステムに対する操作 ext4 xfs
ファイルシステムの作成 mke2fs,mkfs -t ext4 mkfs.xfs
ファイルシステムのパラメータ表示 dumpe2fs xfs_info
ファイルシステムのパラメータ変更 tune2fs xfs_admin
ファイルシステムのラベル表示,変更 e2label xfs_admin
ファイルシステムのエラーチェック,修復 fsck.ext4,e2fsck xfs_repair,fsck.xfs
ファイルシステムデバッグ debugfs xfs_db
ファイルシステムへのアクセス禁止,解除 fsfreeze xfs_freeze,fsfreeze
ファイルシステムデフラグ e4defrag xfs_fsr
ファイル断片化の確認 filefrag xfs_bmap

4 ext4ファイルシステム

4.1 事前準備(デバイスの作成)

ループバックデバイスで使用するファイル(100M)を作成します。なお、ファイルの作り方は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# fallocate -l 100M disk.img

作成したファイルを確認します。

[root@server ~]# ls -l disk.img
-rw-r--r--. 1 root root 104857600  6月  7 19:25 disk.img

作成したファイルをループバックデバイスとして登録します。なお、losetupコマンドの使い方は、losetupコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# losetup -f /root/disk.img

登録したループバックデバイスを確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.img

4.2 ファイルシステム作成(mke2fs)

ループバックデバイス(/dev/loop0)にext4ファイルシステムを作成します。

[root@server ~]# mke2fs -t ext4 /dev/loop0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

ループバックデバイスに作成したファイルシステムを確認します。ext4ファイルシステムが作成されたことがわかります。

[root@server ~]# lsblk -fip /dev/loop0
NAME       FSTYPE LABEL UUID                                 MOUNTPOINT
/dev/loop0 ext4         fb485f39-6486-41f6-801a-f1a00fff3f06

作成したループバックデバイスを/mntにマウントします。

[root@server ~]# mount -o loop /dev/loop0 /mnt

ファイルシステムを確認します。ループバックデバイスが/mntにマウントされていることがわかります。

[root@server ~]# df -hT -t ext4
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop1     ext4      93M  1.6M   85M    2% /mnt

4.3 パラメータ表示/変更(dumpe2fs/tune2fs)

ファイルシステムのチェック回数を変更してみます。マウント回数が、チェック回数を超えると、次回ブート時にファイルシステムfsckを行います。

ファイルシステム作成直後は、チェック回数が-1になっています。

[root@server ~]# dumpe2fs -h /dev/loop0 |grep "Maximum mount count"
dumpe2fs 1.42.9 (28-Dec-2013)
Maximum mount count:      -1

チェック回数を5に設定してみます。

[root@server ~]# tune2fs -c 5 /dev/loop0
tune2fs 1.42.9 (28-Dec-2013)
Setting maximal mount count to 5

チェック回数が5に設定されたことがわかります。

[root@server ~]# dumpe2fs -h /dev/loop0 |grep "Maximum mount count"
dumpe2fs 1.42.9 (28-Dec-2013)
Maximum mount count:      5

4.4 ラベルの表示/設定(e2label)

ファイルシステムのラベルを変更してみます。初期状態を確認します。ラベルが何も設定されていないことがわかります。

[root@server ~]# e2label /dev/loop0

ラベルを確認します。TESTという名前のラベルが設定されたことがわかります。

[root@server ~]# e2label /dev/loop0 TEST

ラベルを確認します。TESTという名前のラベルが設定されたことがわかります。

[root@server ~]# e2label /dev/loop0
TEST

他のコマンドでも、ラベルの確認ができます
dumpe2fsコマンドで確認してみます。

[root@server ~]# dumpe2fs -h /dev/loop0 |grep "Filesystem volume name"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   TEST

lsblkコマンドで確認してみます。lsblkコマンドの使い方は、lsblkコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsblk -fip /dev/loop0
NAME       FSTYPE LABEL UUID                                 MOUNTPOINT
/dev/loop0 ext4   TEST  fb485f39-6486-41f6-801a-f1a00fff3f06

blkidコマンドで確認してみます。

[root@server ~]# blkid /dev/loop0
/dev/loop0: LABEL="TEST" UUID="fb485f39-6486-41f6-801a-f1a00fff3f06" TYPE="ext4"

4.5 エラーチェック(fsck.ext4)

[root@server ~]# fsck.ext4 /dev/loop0
e2fsck 1.42.9 (28-Dec-2013)
TEST: recovering journal
TEST: clean, 11/25688 files, 8896/102400 blocks (check in 4 mounts)

4.6 デバッグ(debugfs)

debugfsコマンドを実行します。

[root@server ~]# debugfs /dev/loop0
debugfs 1.42.9 (28-Dec-2013)
debugfs:

コマンドプロンプトに対してhelpと入力すると、オプションが表示されます。

[root@server ~]# debugfs /dev/loop0
debugfs 1.42.9 (28-Dec-2013)
debugfs:  help
Available debugfs requests:

show_debugfs_params, params
                         Show debugfs parameters
open_filesys, open       Open a filesystem
close_filesys, close     Close the filesystem
-snip-

4.7 アクセス禁止/解除(fsfreeze)

/mntへのアクセス禁止/解除を試してみます。

[root@server ~]# df -hT -t ext4
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop1     ext4      93M  1.6M   85M    2% /mnt

/mntへのアクセスを禁止にします。

[root@server ~]# fsfreeze -f /mnt

アクセス禁止にしたファイルシステムにファイルを作成します。アクセス禁止になっているため、touchコマンドが復帰しません。

[root@server ~]# touch /mnt/test.txt

もう1つターミナルを開きます。新しく開いたターミナルで/mntへのアクセス禁止を解除します。

[root@server ~]# fsfreeze -u /mnt

アクセス禁止を解除するとtouchコマンドが復帰します。

[root@server ~]# touch /mnt/test.txt
[root@server ~]#

touchコマンドが復帰したら、作成したファイルを確認します。

[root@server ~]# ls /mnt/test.txt
/mnt/test.txt

4.8 断片化の状況確認/デフラグ(e4defrag)

[root@server ~]# fallocate -l 80M /mnt/test.dat
[root@server ~]# e4defrag -c /mnt
<Fragmented files>                             now/best       size/ext
1. /mnt/test.dat                                 8/1          10240 KB

 Total/best extents                             8/1
 Average size per extent                        10240 KB
 Fragmentation score                            0
 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
 This directory (/mnt) does not need defragmentation.
 Done.

デフラグを実行してみます。デフラグをするには、オプションなしでe4defragコマンドを実行します。

[root@server ~]# e4defrag /mnt
ext4 defragmentation for directory(/mnt)

        Success:                        [ 0/4 ]
        Failure:                        [ 4/4 ]

4.9 ファイル断片化の確認(filefrag)

ファイルの各部分がファイルシステム内のどのブロックにマッピングされているかがわかります

[root@server ~]# filefrag -v /mnt/test.dat
Filesystem type is: ef53
File size of /mnt/test.dat is 83886080 (81920 blocks of 1024 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   14335:      10241..     24576:  14336:             unwritten
   1:    14336..   28671:      26625..     40960:  14336:      24577: unwritten
   2:    28672..   34815:      43009..     49152:   6144:      40961: unwritten
   3:    34816..   38911:      53249..     57344:   4096:      49153: unwritten
   4:    38912..   53247:      59393..     73728:  14336:      57345: unwritten
   5:    53248..   77823:      75777..    100352:  24576:      73729: unwritten
   6:    77824..   79871:       6145..      8192:   2048:     100353: unwritten
   7:    79872..   81919:       3511..      5558:   2048:       8193: unwritten,eof
/mnt/test.dat: 8 extents found

4.10 あと始末

テストに使用したファイルシステムのアンマウントします。

[root@server ~]# umount /mnt

削除するループバックデバイスを確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.img

ループバックデバイスの削除をします。

[root@server ~]# losetup -d /dev/loop0

ループバックデバイスを確認します。作成したループバックデバイスが削除されたことがわかります。

[root@server ~]# losetup -l

作成したファイルを削除します。

[root@server ~]# rm disk.img
rm: 通常ファイル `disk.img' を削除しますか? y

5 xfsファイルシステム

5.1 事前準備(デバイスの作成)

ループバックデバイスで使用するファイル(100M)を作成します。。

[root@server ~]# fallocate -l 100M disk.img

作成したファイルをループバックデバイスとして登録します。

[root@server ~]# losetup -f /root/disk.img

登録したループバックデバイスを確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.img

5.2 ファイルシステム作成(mkfs.xfs)

ループバックデバイス(/dev/loop0)にxfsファイルシステムを作成します。

[root@server ~]# mkfs.xfs /dev/loop0
Discarding blocks...Done.
meta-data=/dev/loop0             isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

ループバックデバイスに作成したファイルシステムを確認します。xfsファイルシステムが作成されたことがわかります。

[root@server ~]# lsblk -fip /dev/loop0
NAME       FSTYPE LABEL UUID                                 MOUNTPOINT
/dev/loop0 xfs          6326cb24-3ff0-4f48-bcdd-ba45faca27ae

作成したループバックデバイスを/mntにマウントします。

[root@server ~]# mount -o loop /dev/loop0 /mnt

ファイルシステムを確認します。ループバックデバイスが/mntにマウントされていることがわかります。

[root@server ~]#  df -hT -t xfs
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/vda3      xfs      4.8G  2.8G  2.0G   60% /
/dev/vda1      xfs      125M  116M  8.8M   94% /boot
/dev/loop1     xfs       97M  5.3M   92M    6% /mnt

5.3 パラメータの表示(xfs_info)

[root@server ~]# xfs_info /mnt/
meta-data=/dev/loop1             isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

5.4 パラメータの変更(xfs_admin)

ファイルシステムのラベルを変更してみます。初期状態を確認します。ラベルが何も設定されていないことがわかります。

[root@server ~]# xfs_admin -l /dev/loop0
label = ""

TESTという名前のラベルを設定します。

[root@server ~]# xfs_admin -L TEST /dev/loop0
writing all SBs
new label = "TEST"

ラベルを確認します。TESTという名前のラベルが設定されたことがわかります。

[root@server ~]# xfs_admin -L TEST /dev/loop0
writing all SBs
new label = "TEST"

5.5 エラーチェック(xfs_repair)

ファイルシステムが壊れていないかどうかをチェックします。
壊れていた場合、ファイルシステムの修復を行います。
ファイルシステムをアンマウントした状態で実行します。

[root@server ~]# umount /mnt
[root@server ~]# xfs_repair /dev/loop0
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 2
        - agno = 3
        - agno = 1
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

5.6 デバッグ(debugfs)

[root@server ~]# xfs_db /dev/loop0
xfs_db>

コマンドプロンプトに対してhelpと入力すると、オプションが表示されます。

[root@server ~]# xfs_db /dev/loop0
xfs_db> help
ablock filoff -- set address to file offset (attr fork)
addr [field-expression] -- set current address
agf [agno] -- set address to agf header
-snip-

5.7 ファイルシステムデフラグ(xfs_fsr)

[root@server ~]# df -hT -t xfs /mnt
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop1     xfs       97M  5.3M   92M    6% /mnt
[root@server ~]# fallocate -l 80M /mnt/test.dat
[root@server ~]# xfs_fsr -v /mnt
/mnt start inode=0
ino=67
insufficient freespace for: ino=67: size=83886080: ignoring

5.8 ファイル断片化の確認(xfs_bmap)

テスト用ファイルを作成するファイルシステムを確認します。

/mntにテスト用ファイル(80M)を作成します。

[root@server ~]# fallocate -l 80M /mnt/test.dat

ファイルの断片化を確認します。ファイルの各部分がファイルシステム内のどのブロックにマッピングされているかがわかります。ファイルが4つのエクステントに分割されていることがわかります。

[root@server ~]# xfs_bmap -v /mnt/test.dat
/mnt/test.dat:
 EXT: FILE-OFFSET       BLOCK-RANGE      AG AG-OFFSET        TOTAL
   0: [0..51063]:       128..51191        0 (128..51191)     51064
   1: [51064..102191]:  51264..102391     1 (64..51191)      51128
   2: [102192..146479]: 109304..153591    2 (6904..51191)    44288
   3: [146480..163839]: 153664..171023    3 (64..17423)      17360

フラグメントの状況は、xfs_dbコマンドを使っても確認できます。

[root@server ~]#  xfs_db -r /dev/loop0
xfs_db> frag
actual 4, ideal 1, fragmentation factor 75.00%
Note, this number is largely meaningless.
Files on this filesystem average 4.00 extents per file
xfs_db>

5.9 あと始末

テストに使用したファイルシステムのアンマウントします。

[root@server ~]# umount /mnt

削除するループバックデバイスを確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.img

ループバックデバイスの削除をします。

[root@server ~]# losetup -d /dev/loop0

ループバックデバイスを確認します。作成したループバックデバイスが削除されたことがわかります。

[root@server ~]# losetup -l
[root@server ~]#

作成したファイルを削除します。

[root@server ~]#  rm disk.img
rm: 通常ファイル `disk.img' を削除しますか? y

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ