8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LinuxAdvent Calendar 2018

Day 3

Linux-4.19.6でEROFS(Enhanced Read-Only File System)な環境を作る

Last updated at Posted at 2018-12-03

Linux Advent Calendar 2018 3日目の記事です。
今日はLinux-4.19.6で追加された、EROFS(Enhanced Read-Only File System)が利用できる環境を作る話をしようと思います。

EROFSとは?

Linux-4.19.6で搭載された機能で、ライトウェイトでリードオンリーなファイルシステムとのことです。
競合するファイルシステムは他にも存在しますが、EROFSはファームウェアやスマートフォン、LiveCDといった、リードオンリーなファイルシステムに対して高パフォーマンスが要求される場面での利用を想定しているようです。
(というよりも、Kconfigの説明が正確で手っ取り早いですね...)

config EROFS_FS
        tristate "EROFS filesystem support"
        depends on BLOCK
        help
          EROFS(Enhanced Read-Only File System) is a lightweight
          read-only file system with modern designs (eg. page-sized
          blocks, inline xattrs/data, etc.) for scenarios which need
          high-performance read-only requirements, eg. firmwares in
          mobile phone or LIVECDs.

          It also provides VLE compression support, focusing on
          random read improvements, keeping relatively lower
          compression ratios, which is useful for high-performance
          devices with limited memory and ROM space.

          If unsure, say N.

今回はこのEROFSを利用可能にする手順と、実際にEROFSなファイルシステムを作成できるまでをゴールにしてみます。

今回の環境

今回EROFSを試した環境はCentOS-7です。

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

Linux-4.19.6のビルド

まずはEROFSを利用できるLinux-4.19.6をビルドします。
余談ですがEROFSのソースコードは linux-4.19.6/drivers/staging/erofs 以下に置かれており、まだ実験・テスト的な位置付けという扱いであるようです。

# curl -O https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.6.tar.xz
# tar Jxf linux-4.19.6.tar.xz
# cd linux-4.19.6

必要なカーネルコンフィグ

EROFSを使用するために最低限必要なカーネルコンフィグは STAGINGEROFS_FS です。それぞれカーネルコンフィグの以下の場所で設定します。

STAGING
  -> Device Drivers

EROFS_FS
  -> Device Drivers
    -> Staging Drivers

先ほど展開したlinux-4.19.6のディレクトリに移動し、カーネルコンフィグの設定とビルドを実行します。

# cd linux-4.19.6
# make defconfig
# make manuconfig
# make
# make modules_install
# cp arch/x86_64/boot/bzImage /boot/vmlinuz-4.19.6.x86_64
# mkinitrd /boot/initramfs-4.19.6.x86_64.img 4.19.6
# grub2-mkconfig -o /boot/grub2/grub.cfg

あとは再起動した後、grubからlinux-4.19.6を選択して起動します。
カーネルバージョンが4.19.6かどうかは、 uname コマンドで確認できます。

$ uname -a
Linux linuxadvcal 4.19.6 #2 SMP Mon Dec 3 18:47:26 JST 2018 x86_64 x86_64 x86_64 GNU/Linux

EROFSを試してみる

Linuxカーネル側の準備も完了し、EROFSを試せる状態になりました。

EROFS対応版のmkfsコマンド

さっそく mkfs コマンドを実行したいところですが、先にEROFS対応版の mkfs コマンドを用意する必要があります。
EROFS対応版 mkfs コマンドは、以下のGitHubリポジトリにて公開されているので、そこから入手します。

# curl -s -L -O https://github.com/hsiangkao/erofs_mkfs_binary/raw/master/mkfs.erofs.x86_64
# file mkfs.erofs.x86_64
mkfs.erofs.x86_64: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=c8fff00e3d9261ad4d6937f50c0664cb3bce74ae, stripped
# chmod +x mkfs.erofs.x86_64  # 実行属性をつける必要あり

コマンド名は mkfs.erofs で、指定可能なオプションは以下のようです。

# ./mkfs.erofs.x86_64
[2018-12-03 21:01:39 205797] Err: MKFS: mkfs_parse_options_cfg() Line[151]Expected filename after options

mkfs.erofs.x86_64 version:rel v3.0.180606.0 buildTime:Jul  4 201821:15:42
    [-z <compr algi>] [-d <debug level>]
    [-h <shared xattr threhold>] [-x <debug level>]
    [image name] [target_out_directory]

そして、ちょっと注意が必要なのは、 mkfs.erofs には デバイス名ではなくイメージファイルを指定する 点です。
mkfs.btefs とか mkfs.ext4 等ではデバイス名を指定してmkfsするのですが、EROFSではちょっと異なるようです。
( mkfs.erofs 用に別途 /dev/sdb なストレージを用意したのですが不要でした...)

EROFSの利用例として、LinuxカーネルソースツリーをEROFSでフォーマット(イメージ作成)してみます。

# ./mkfs.erofs.x86_64 erofs_sample.img work/linux-4.19.6
[2018-12-03 21:07:23 694510] Err: EROFS: erofs_adjust_compress_level() Line[77]Compress level(9) is greater than max level(0), adjust it to default level(9).

        c_version:             [version:rel v3.0.180606.0 buildTime:Jul  4 201821:15:42]
        c_src_path:            [/root/linux-4.19.6]
        c_dbg_lvl:             [       0]
        c_dry_run:             [       0]
        c_alg_name:            [    none]
        c_compr_maxsz:         [  921600]
        c_compr_lvl:           [       0]
        c_compr_boundary:      [     128]
        c_compr_ratio_limit:   [     100]
        c_cust_xattr:          [       0]
        c_shared_xattr_thres:  [       4]
[2018-12-03 21:07:23 695102] Err: MKFS-XATTR:mkfs_add_xattr() Line[266][/root/linux-4.19.6] has no attributes.
...中略...
[2018-12-03 21:07:02 557461] Err: MKFS-XATTR:mkfs_add_xattr() Line[266][/root/linux-4.19.6/drivers/gpu/drm/v3d/v3d_trace.h] has no attributes.
[2018-12-03 21:07:02 557539] Err: MKFS-XATTR:mkfs_add_xattr() Line[266][/root/linux-4.19.6/drivers/gpu/drm/v3d/v3d_trace_points.c] has no attributes.

attributeまわりでエラーが出ているのが不安ですが(もしかしたらカーネルコンフィグの設定に漏れがあるのかも)、 mkfs.erofs でイメージファイルが作成できました。

# ls -lh erofs_sample.img
-rw-r--r-- 1 root root 759M 12月  3 21:10 erofs_sample.img
#
# # 元のディレクトリツリーよりもサイズが小さくなっているようです。
# du -h linux-4.19.6/ | tail -n1
896M    linux-4.19.6/

さっそくイメージをmountしてみましょう。

# # "-t erofs"が指定可能になっている。
# mount -o loop -t erofs erofs_sample.img /mnt
#
# # mountできているか確認する。
# mount | grep \/mnt
/root/erofs_sample.img on /mnt type erofs (ro,relatime,user_xattr,acl)
#
# # ファイルシステムのサイズを確認する。
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
...中略...
/dev/loop0       759M  759M     0  100% /mnt
#
# # ファイルシステムタイプはerofsになっている。
# df -T
ファイルシス   タイプ   1K-ブロック    使用   使用可 使用% マウント位置
...中略...
/dev/loop0     erofs         776684  776684        0  100% /mnt

(念のため) mkfs.erofs 実行時にattribute周りのエラーが出ていましたが、生成されたイメージに含まれるファイルに抜けは無いようです。

# # 個数が同じであることをもって、ファイルに抜けがないとみなす。
# find /mnt/ | wc -l
65825
# find ./linux-4.19.6 | wc -l
65825

まとめ

Linux-4.19.6で追加されたEROFSが利用できる環境の構築手順を紹介しました。
mkfs.erofs で指定するフォーマット先がデバイス名ではなくファイル名なのは意外でしたが、これはファームウェアへのイメージ書き込みを想定した仕様なのかもしれません。

8
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?