NetBSDでnilfsを試してみる。

[NetBSD Advent Calendar 2017](https://qiita.com/advent-calendar/2017/netbsd) 7日目の記事です。

今日は[nilfs]()をNetBSDで試してみたよ！(試しただけ...)の話をしようと思います。単に試してみたよ、的な話ですがNetBSDでサポートしている様々なファイルシステムを試してみるための足がかかりになればと思います。

## nilfsって何？

[nilfa](http://nilfs.osdn.jp/ja/)は「連続的にスナップショットを作成することを特徴とする Linux 向けのログ構造化ファイルシステムです。 」(nilfs公式サイトより引用)とのことで、現在はLinuxカーネルに取り込まれているファイルシステムの一つです。
[Wikipediaのnilfsの記事](https://ja.wikipedia.org/wiki/NILFS)を見ると、対応プラットフォームに"NetBSD"が含まれています。カーネルソースコードをgrepしてみると、確かにnilfs関連のソースコードが存在しているようです。

```
fpig@vmnbsd71 sys $ find fs/ -type f | grep nilfs | grep -v CVS
fs/nilfs/files.nilfs
fs/nilfs/Makefile
fs/nilfs/nilfs_bswap.h
fs/nilfs/nilfs.h
fs/nilfs/nilfs_mount.h
fs/nilfs/nilfs_fs.h
fs/nilfs/nilfs_vfsops.c
fs/nilfs/nilfs_subr.c
fs/nilfs/nilfs_subr.h
fs/nilfs/nilfs_vnops.c
```

## nilfsを有効にしたカーネルを作成してみる

カーネルコンフィグレーションでnilfsを有効にしてビルドします。ビルド手順は[こちらの記事](https://qiita.com/furandon_pig/items/35164d2ccc4e1dda160e#%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89)をご参照ください。

```
fpig@vmnbsd71 ~ $ cd /usr/src/sys/arch/amd64/conf/
fpig@vmnbsd71 conf $ diff -ur GENERIC ADVCAL2017
--- GENERIC     2016-12-23 15:33:56.000000000 +0900
+++ ADVCAL2017  2017-12-03 18:21:12.000000000 +0900
@@ -157,8 +157,8 @@
 file-system    CODA            # Coda File System; also needs vcoda (below)
 file-system    PTYFS           # /dev/ptm support
 #file-system   UDF             # experimental - OSTA UDF CD/DVD file-system
-#file-system   HFS             # experimental - Apple HFS+ (read-only)
-#file-system   NILFS           # experimental - NTT's NiLFS(2)
+file-system    HFS             # experimental - Apple HFS+ (read-only)
+file-system    NILFS           # experimental - NTT's NiLFS(2)

 # File system options
 options        QUOTA           # legacy UFS quotas
```

ビルドしたカーネルでNetBSDを起動すると、nilfsが利用できるようになります。

## nilfsでフォーマットしたディスクイメージを用意する

実はNetBSDでのnilfsサポートは現状だと読み込みのみのため、nilfsでのフォーマットとファイル書き込みはLinuxでの作業になります...。

以下はLinux(Ubuntu 16.04.3 LTS)での作業になります。

### nilfs関連ツールのインストール

```
root@2f4f2dea8c03:~# apt-cache search nilfs
libguestfs-nilfs - guest disk image management system - NILFS v2 support
nilfs-tools - Continuous Snapshotting Log-structured Filesystem
nilfs-tools-dbg - Continuous Snapshotting Log-structured Filesystem (debug)
root@2f4f2dea8c03:~# apt-get install -y nilfs-tools
```

コマンドとしては以下がインストールされます。

```
root@2f4f2dea8c03:~# dpkg -L nilfs-tools | grep bin\/
/sbin/nilfs_cleanerd
/sbin/mkfs.nilfs2
/sbin/umount.nilfs2
/sbin/mount.nilfs2
/usr/sbin/nilfs-tune
/usr/sbin/nilfs-clean
/usr/sbin/nilfs-resize
/usr/bin/dumpseg
/usr/bin/chcp
/usr/bin/lssu
/usr/bin/mkcp
/usr/bin/lscp
/usr/bin/rmcp
```

### ディスクイメージを作成する

```
# # 256MBのディスクイメージを作成する。
root@2f4f2dea8c03:~# dd if=/dev/zero of=nilfs.img bs=26214400 count=10
```

### ディスクイメージをnilfsでフォーマットする

nilfsでディスクイメージをフォーマットしたのち、確認用に適当なファイルを作成します。

```
root@2f4f2dea8c03:~# mkfs.nilfs2 ./nilfs.img
mkfs.nilfs2 (nilfs-utils 2.2.3)
Start writing file system initial data to the device
       Blocksize:4096  Device:./nilfs.img  Device Size:262144000
File system initialization succeeded !!
root@2f4f2dea8c03:~# mount -o loop nilfs.img ./mnt_nilfs/
root@2f4f2dea8c03:~# mount | grep nilfs
/root/nilfs.img on /root/mnt_nilfs type nilfs2 (rw,relatime)
root@2f4f2dea8c03:~# echo 'Hello,nilfs.' > ./mnt_nilfs/hello.txt
root@2f4f2dea8c03:~# cat ./mnt_nilfs/hello.txt
Hello,nilfs.
```

このディスクイメージをNetBSD環境に持っていてファイルの中身がみられるか試してみます。

## NetBSDでのnilfsマウント

`vndconfg` でディスクイメージをループバックマウントするための準備を行います。

```
fpig@vmnbsd71 ~ $ sudo vnconfig vnd0 nilfs.img
fpig@vmnbsd71 ~ $ sudo vnconfig -l
vnd0: / (/dev/wd0a) inode 185547
vnd1: not in use
vnd2: not in use
vnd3: not in use
```

### マウントして確認してみる

nilfsファイルシステムをmountしてみます。現状は読み取り専用でのmountになります。

以下の手順で無事にnilfsでフォーマットしたファイルの中身を見ることができました。

```
fpig@vmnbsd71 ~ $ sudo mount -w -t nilfs /dev/vnd0a /home/fpig/mnt_nilfs
mount_nilfs: Cannot mount /dev/vnd0a on /home/fpig/mnt_nilfs: Read-only file system
fpig@vmnbsd71 ~ $ mount | grep nilfs
/dev/vnd0a on /home/fpig/mnt_nilfs type nilfs (local)
fpig@vmnbsd71 ~ $ cat ./mnt_nilfs/hello.txt
Hello,nilfs.
```

## まとめ

NetBSDでnilfsを試してみました。現状では読み込みのみになっていますが、同様の手法でNetBSDがサポートするファイルシステム(HFSとか)をお手軽に試してみることができそうです。