btrfs

btrfsとは、、簡単にいえばいろいろできるファイルシステムである。既存のファイルシステムと何が違うのか、試してみよう。ただし、それなりの不安定さは覚悟しなくてはなるまい。

前準備

破壊されてもいいようなディスクが一本あった方が楽かもしれない。とはいえもちろんハードウェアまでに障害を与えるものではないが、、壊れた時のナニで。

で、debian jessieにおけるbtrfsをsearchした結果が以下の通り

% apt-cache search btrfs
btrfs-tools - Checksumming Copy on Write Filesystem utilities
disktype - detection of content format of a disk or disk image
libguestfs0 - guest disk image management system - shared library
parted - disk partition manipulator
python-larch - B-tree library for Python
schroot - Execute commands in a chroot environment
snapper - Linux filesystem snapshot management tool
extlinux - collection of bootloaders (Linux ext2/ext3/ext4, btrfs, and xfs bootloader)
isolinux - collection of bootloaders (ISO 9960 bootloader)
pxelinux - collection of bootloaders (PXE network bootloader)
syslinux - collection of bootloaders (DOS FAT and NTFS bootloader)
syslinux-common - collection of bootloaders (common)
syslinux-efi - collection of bootloaders (UEFI bootloader)
syslinux-utils - collection of bootloaders (utilities)
system-storage-manager - system storage management tool
btrfs-tools-dbg - チェックサム付きコピーオンライトファイルシステム用ユーティリティ (デバッグ)

どうみてもbtrfs-toolsが必要そうな感じだからinstallしましょう。

入った後の結果

% dpkg -L btrfs-tools
/.
/lib
/lib/udev
/lib/udev/rules.d
/lib/udev/rules.d/80-btrfs-lvm.rules
/lib/udev/rules.d/70-btrfs.rules
/sbin
/sbin/btrfstune
/sbin/btrfs
/sbin/fsck.btrfs
/sbin/btrfs-select-super
/sbin/btrfs-zero-log
/sbin/btrfsck
/sbin/btrfs-show-super
/sbin/mkfs.btrfs
/sbin/btrfs-find-root
/sbin/btrfs-image
/sbin/btrfs-map-logical
/sbin/btrfs-convert
/sbin/btrfs-debug-tree
/sbin/btrfs-calc-size
/usr
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/btrfs-tools
/usr/share/initramfs-tools
/usr/share/initramfs-tools/hooks
/usr/share/initramfs-tools/hooks/btrfs
/usr/share/initramfs-tools/scripts
/usr/share/initramfs-tools/scripts/local-premount
/usr/share/initramfs-tools/scripts/local-premount/btrfs
/usr/share/doc
/usr/share/doc/btrfs-tools
/usr/share/doc/btrfs-tools/changelog.Debian.gz
/usr/share/doc/btrfs-tools/copyright
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/btrfs.5.gz
/usr/share/man/man8
/usr/share/man/man8/btrfs-qgroup.8.gz
/usr/share/man/man8/btrfs-filesystem.8.gz
/usr/share/man/man8/btrfs-image.8.gz
/usr/share/man/man8/btrfs-send.8.gz
/usr/share/man/man8/btrfs-inspect-internal.8.gz
/usr/share/man/man8/btrfs-check.8.gz
/usr/share/man/man8/btrfs-property.8.gz
/usr/share/man/man8/fsck.btrfs.8.gz
/usr/share/man/man8/btrfs-subvolume.8.gz
/usr/share/man/man8/btrfs-show-super.8.gz
/usr/share/man/man8/btrfs-quota.8.gz
/usr/share/man/man8/btrfs-debug-tree.8.gz
/usr/share/man/man8/btrfs-rescue.8.gz
/usr/share/man/man8/btrfs-balance.8.gz
/usr/share/man/man8/btrfs-receive.8.gz
/usr/share/man/man8/btrfs.8.gz
/usr/share/man/man8/btrfs-convert.8.gz
/usr/share/man/man8/btrfstune.8.gz
/usr/share/man/man8/btrfs-restore.8.gz
/usr/share/man/man8/mkfs.btrfs.8.gz
/usr/share/man/man8/btrfs-device.8.gz
/usr/share/man/man8/btrfs-scrub.8.gz
/usr/share/man/man8/btrfs-find-root.8.gz
/usr/share/man/man8/btrfs-map-logical.8.gz
/usr/share/man/man8/btrfs-replace.8.gz
/usr/share/man/man8/btrfs-zero-log.8.gz
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libbtrfs.a
/usr/lib/x86_64-linux-gnu/libbtrfs.so.0.1
/usr/include
/usr/include/btrfs
/usr/include/btrfs/crc32c.h
/usr/include/btrfs/send.h
/usr/include/btrfs/list.h
/usr/include/btrfs/btrfs-list.h
/usr/include/btrfs/radix-tree.h
/usr/include/btrfs/send-stream.h
/usr/include/btrfs/extent-cache.h
/usr/include/btrfs/kerncompat.h
/usr/include/btrfs/btrfsck.h
/usr/include/btrfs/version.h
/usr/include/btrfs/ctree.h
/usr/include/btrfs/send-utils.h
/usr/include/btrfs/rbtree.h
/usr/include/btrfs/extent_io.h
/usr/include/btrfs/ioctl.h
/usr/share/man/man8/btrfsck.8.gz
/usr/lib/x86_64-linux-gnu/libbtrfs.so.0
/usr/lib/x86_64-linux-gnu/libbtrfs.so

流石に管理者用という事で/sbinにいろいろ放りこまれている。この部分だけを抜粋すると

/sbin/btrfstune
/sbin/btrfs
/sbin/fsck.btrfs
/sbin/btrfs-select-super
/sbin/btrfs-zero-log
/sbin/btrfsck
/sbin/btrfs-show-super
/sbin/mkfs.btrfs
/sbin/btrfs-find-root
/sbin/btrfs-image
/sbin/btrfs-map-logical
/sbin/btrfs-convert
/sbin/btrfs-debug-tree
/sbin/btrfs-calc-size

であり、この辺がbtrfsをマネージメントするツールという事になろう。そして、他のfsと同じく、mkfs.btfsがファイルシステムを作成するユーティリティになっている

btrfsファイルシステムを作成する

ここでは、新規ディスクの/dev/sdhというのに対して操作してみる。デバイス名は適時読みかえていただきたい。

オプションは沢山あれど、そのほとんどがプロ要なので、ここでは読み飛ばしてもよいと思う。

# mkfs.btrfs --help
mkfs.btrfs: unrecognized option '--help'
usage: mkfs.btrfs [options] dev [ dev ... ]
options:
         -A --alloc-start the offset to start the FS
         -b --byte-count total number of bytes in the FS
         -d --data data profile, raid0, raid1, raid5, raid6, raid10, dup or single
         -f --force force overwrite of existing filesystem
         -l --leafsize size of btree leaves
         -L --label set a label
         -m --metadata metadata profile, values like data profile
         -M --mixed mix metadata and data together
         -n --nodesize size of btree nodes
         -s --sectorsize min block allocation (may not mountable by current kernel)
         -r --rootdir the source directory
         -K --nodiscard do not perform whole device TRIM
         -O --features comma separated list of filesystem features
         -U --uuid specify the filesystem UUID
         -V --version print the mkfs.btrfs version and exit
Btrfs v3.17

普通にコマンドをデバイス(パーティション)に対して叩くだけ

# mkfs.btrfs /dev/sdh1
Btrfs v3.17
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
fs created label (null) on /dev/sdh1
        nodesize 16384 leafsize 16384 sectorsize 4096 size 1.82TiB

既にパーティションが存在しているのを検知すると、作らせてくれない。その場合は-fを与えよう

# mkfs.btrfs /dev/sdh1
/dev/sdh1 appears to contain an existing filesystem (btrfs).
Error: Use the -f option to force overwrite.

あとは、普通に使う分にはmountすればok

# mount /dev/sdh1  /mnt
# mount | grep sdh
/dev/sdh1 on /mnt type btrfs (rw,relatime,space_cache)

btrfsでマウントされている事がわかる。もちろん、普通に読みかき可能である。

で、何がすごいんだよ

というか、ext3,ext4と比べてどういう所でお得なのかが、一番気になる所であろう(そりゃそうだ)。とりあえずトリッキーな使い方のために、一度パーティションを解除しておこう。

                                 Disk: /dev/sdh
             Size: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
                       Label: dos, identifier: 0x71524588

    Device       Boot        Start          End      Sectors    Size   Id Type
    /dev/sdh1                 2048     20973567     20971520     10G   83 Linux
    /dev/sdh2             20973568     41945087     20971520     10G   83 Linux
    /dev/sdh3             41945088     62916607     20971520     10G   83 Linux
>>  Free space            62916608   3907029167   3844112560    1.8T










             [    New   ]  [   Quit   ]  [   Help   ]  [   Write  ]

このように、ツールは何でもいいのだが10Gのパーティションを3つ作成してみた。 btrfsはパーティンを跨いで作成する事ができるのだ、何と。、やってみよう。

# mkfs.btrfs -f -L testbtrfs  /dev/sdh1 /dev/sdh2 /dev/sdh3
Btrfs v3.17
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
adding device /dev/sdh2 id 2
adding device /dev/sdh3 id 3
fs created label testbtrfs on /dev/sdh1
        nodesize 16384 leafsize 16384 sectorsize 4096 size 30.00GiB

詳細なオプションはバチっと割愛するとして、ここで、/dev/sdh3をマウントしてみよう

# mount /dev/sdh3 /mnt
# mount | grep /mnt
/dev/sdh1 on /mnt type btrfs (rw,relatime,space_cache)

なんとまあ、/dev/sdh3をマウントしたはずがsdh1がマウントされている。dfはというと

# df  -h | grep /mnt
/dev/sdh1         30G  1.3M   27G    1% /mnt

このように、パーティションが合計された値となっている。うーん、トリッキーですねえ。

これはどうなっとるのかというのはbtrfsコマンドで確認する

# btrfs filesystem show /dev/sdh1
Label: 'testbtrfs'  uuid: 39a301a0-8d3e-49da-b033-6996a2b1244d
        Total devices 3 FS bytes used 1.12MiB
        devid    1 size 10.00GiB used 2.02GiB path /dev/sdh1
        devid    2 size 10.00GiB used 1.01GiB path /dev/sdh2
        devid    3 size 10.00GiB used 2.01GiB path /dev/sdh3

Btrfs v3.17

raidレベルがどうとかこうとかいうのもあるのだが、とりあえず後ほど。

サブボリューム

実際btrfsといえばサブボリュームなのであった。ここで、サブボリュームが何ぞやという解説は完全に後まわしにするので、先程作成したbtrfsに対して以下のコマンドを発行してみよう。

# btrfs subvolume create /mnt/sub1
Create subvolume '/mnt/sub1'
# btrfs subvolume create /mnt/sub2
Create subvolume '/mnt/sub2'
# btrfs subvolume create /mnt/sub2/sub3
Create subvolume '/mnt/sub2/sub3'
# find /mnt
/mnt
/mnt/sub1
/mnt/sub2

何となくmkdirしただけのようにも見えるが全く別物である。試しに消そうとすると怒られるでござる。

# rmdir /mnt/sub1
rmdir: `/mnt/sub1' を削除できません: 許可されていない操作です

subvolumeをリストするにはこんなコマンドを使う

# btrfs subvolume list /mnt
ID 258 gen 10 top level 5 path sub1
ID 259 gen 10 top level 5 path sub2
ID 260 gen 10 top level 259 path sub2/sub3

サブボリュームというのは、パーティションの概念で話をすれば、パーティションの中にパーティションがあるようなものである。実際ボリュームという名前からすればパーティションというよりLVMの概念に近いのであろうが、概念的な事はともかく、これをマウントできるという事。やってみよう。一度umountしておく

# umount /mnt

でIDを指定してマウントする。つまりIDは覚えとけって事ですね

# mount -o subvolid=258 /dev/sdh1 /mnt

とまあ、こんな感じで深い所までマウントする事ができますぞいという事。ファイルとか作っていないので、まだ何やってんのかよくわからないだろうが、次の節にGo!

スナップショット

とりあえず、今、sub1というサブボリュームをマウントしている状態にある場合は解除して、親をマウントする事。

何かファイルがあるとよいので、適当にコピーしてこよう。

# cd /mnt/sub1
# cp -a /usr/share/doc/* .
# df -h | grep mnt
/dev/sdh1         30G  5.6M   27G    1% /mnt

まあ、ズバっと/usr/share/doc以下をコピーしてきたでござる。

ここでsnapshotを作成してみよう。

# btrfs subvolume snapshot /mnt/sub1/ /mnt/sub1/snap
Create a snapshot of '/mnt/sub1/' in '/mnt/sub1/snap'

/mnt/sub1/vim/copyrightに悪さをしてみよう。

# echo "hehehe" >> /mnt/sub1/vim/copyright
# tail /mnt/sub1/vim/copyright

B. To prohibit any publication of this work or derivative works in whole or in
part in standard (paper) book form for commercial purposes is prohibited unless
prior permission is obtained from the copyright holder.

To accomplish this, add the phrase 'Distribution of the work or derivative of
the work in any standard (paper) book form is prohibited unless prior
permission is obtained from the copyright holder.' to the license reference or
copy.
hehehe

もちろん、snapshotには変更がない

# tail /mnt/sub1/snap/vim/copyright
copyright holder.' to the license reference or copy.

B. To prohibit any publication of this work or derivative works in whole or in
part in standard (paper) book form for commercial purposes is prohibited unless
prior permission is obtained from the copyright holder.

To accomplish this, add the phrase 'Distribution of the work or derivative of
the work in any standard (paper) book form is prohibited unless prior
permission is obtained from the copyright holder.' to the license reference or
copy.

ので、コピーしてきてもいいんだろうが、ここで想定されるのは1ファイルどころではなくもうボリューム全体がアカンという時。

あ、ちなみに今は親をマウントしているけど、子はどうだろうというのを一度試してみましょう。 listする。

# btrfs subvolume list /mnt
ID 258 gen 20 top level 5 path sub1
ID 259 gen 10 top level 5 path sub2
ID 260 gen 10 top level 259 path sub2/sub3
ID 261 gen 20 top level 258 path sub1/snap

ID258とID261をマウントしてみよう/mntと/optが開いてるのでその辺に

# mount -o subvolid=258 /dev/sdh1 /mnt
# mount -o subvolid=261 /dev/sdh1 /opt
# tail /mnt/vim/copyright

B. To prohibit any publication of this work or derivative works in whole or in
part in standard (paper) book form for commercial purposes is prohibited unless
prior permission is obtained from the copyright holder.

To accomplish this, add the phrase 'Distribution of the work or derivative of
the work in any standard (paper) book form is prohibited unless prior
permission is obtained from the copyright holder.' to the license reference or
copy.
hehehe

# tail /opt/vim/copyright
copyright holder.' to the license reference or copy.

B. To prohibit any publication of this work or derivative works in whole or in
part in standard (paper) book form for commercial purposes is prohibited unless
prior permission is obtained from the copyright holder.

To accomplish this, add the phrase 'Distribution of the work or derivative of
the work in any standard (paper) book form is prohibited unless prior
permission is obtained from the copyright holder.' to the license reference or
copy.

とまあ、このような感じですわ。大体感覚が掴めてきたね?(多分)

で、ここではsub1を消し去りたいと。こういう時はとりあえずアンマウントします。

# umount /mnt
# umount /opt

で、トップをマウントするです。

# mount  /dev/sdh1 /mnt
# ls /mnt
sub1  sub2
btrfs.txt · 最終更新: 2016/05/15 23:36 by admin
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0