インストール - F2FS

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

SUSEにおいて、古いファイルシステムの多くは、セキュリティのためブラックリストとして設定している。
F2FS等のファイルシステムを使用するには、SUSE向けのLinuxカーネルをユーザ自身でコンパイルする必要がある。

ここでは、Linuxカーネルをコンパイルして、Linuxカーネルモジュールをインストールする手順を記載する。


F2FSモジュールのみインストールする方法 (推奨)

F2FSモジュールのソースコードのダウンロード

Linuxカーネルのソースコードをダウンロードする。

  • パッケージ管理システムから、Linuxカーネルのソースコードをインストールする場合
    sudo zypper install kernel-source

  • Linuxカーネルの公式webサイトから、Linuxカーネルのソースコードをダウンロードする場合
    Linuxカーネルの公式webサイトまたはGithubにアクセスして、対応するバージョンのLinuxカーネルのソースコードをダウンロードする。
    あるいは、Linuxカーネルの公式webサイトにあるGitから、対応するバージョンのLinuxカーネルをダウンロードする。
    ダウンロードしたファイルを解凍する。
    tar xf linux-<バージョン>.tar.gz
    cd linux-<バージョン>


F2FSモジュールのソースコードの修正 : SLE 15 SP4 / openSUSE Leap 15.4のみ

SLE 15 SP4 / openSUSE Leap 15.4において、パッケージ管理システムからLinuxカーネル 5.14.21-150400.22のソースコードを使用する場合、
F2FSのソースコードの一部にリグレッション(デグレード)が発生しているため、F2FSのソースコードを修正する必要がある。

sudo vi /usr/src/linux-5.14.21-150400.22/fs/f2fs/file.c


# /usr/src/linux-5.14.21-150400.22/fs/f2fs/file.cファイル

# 修正前
1093行目 : filemap_invalidate_lock(mapping)
1101行目 : filemap_invalidate_lock(mapping)

# 修正後
1093行目 : filemap_invalidate_lock(inode->i_mapping)
1101行目 : filemap_invalidate_lock(inode->i_mapping)


F2FSモジュールのインストール

既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。
make olderconfigコマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。

make -j $(nproc) olddefconfig O=.
# または
sudo make -j $(nproc) olddefconfig O=.


F2FSのビルド設定を行うため、make menuconfigコマンドを実行する。

make menuconfig -j $(nproc)
# または
sudo make menuconfig -j $(nproc)


TUI画面が起動するので、[File systems] - [F2FS filesystem support]に移動して、[M]キーを押下する。
TUI画面下にある[Save]を選択して、上記の設定を保存する。

セキュアブートが無効の場合は、Linuxカーネルモジュールに圧縮の設定を行ってビルドおよびインストールしてもよい。
もし、Linuxカーネルモジュールに圧縮の設定を行う場合は、以下に示すように、Linuxカーネルのビルドディレクトリにある.configファイルを編集する。

sudo vi /usr/src/linux-<カーネルのバージョン>/.config


  • SUSE 15.4の場合
    以下の設定を追記する。
    # /usr/src/linux-<カーネルのバージョン>/.configファイル
    CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT=y # 新しく追加する
    CONFIG_MODULE_COMPRESS=y # 新しく追加する
    # CONFIG_MODULE_COMPRESS_NONE=n # コメントアウトする
    CONFIG_MODULE_COMPRESS_ZSTD=y # 新しく追加する

  • SUSE 15.3以前の場合
    "MODULE_COMPRESS"を検索して、"MODULE_COMPRESS"の直下に、以下の設定を追記する。
    # /usr/src/linux-<カーネルのバージョン>/.configファイル
    CONFIG_MODULE_COMPRESS=y
    CONFIG_MODULE_COMPRESS_XZ=y


Linuxカーネルから、F2FSのみをビルドする。

  • INSTALL_MOD_DIRオプション
    一般的に、カーネルモジュールは、/lib/modules/$(uname -r)/extraディレクトリにインストールされる。
    任意のディレクトリに配置したい場合、INSTALL_MOD_DIRオプションを付加して、extraディレクトリに代わるパスを指定する。
    例えば、INSTALL_MOD_DIR=fs/f2fsと指定する場合、インストールディレクトリは/lib/modules/$(uname -r)/fs/f2fsディレクトリとなる。
sudo make scripts prepare modules_prepare -j $(nproc)
sudo make -C . M=fs/f2fs -j $(nproc)

sudo mkdir -p /lib/modules/$(uname -r)/kernel/fs/f2fs/
sudo cp fs/f2fs/f2fs.ko  /lib/modules/$(uname -r)/kernel/fs/f2fs/

# または

sudo make prepare -j $(nproc)
sudo make modules_prepare -j $(nproc)
sudo make M=fs/f2fs -j $(nproc)
sudo make modules M=fs/f2fs -j $(nproc)
sudo make modules_install M=fs/f2fs INSTALL_MOD_DIR=kernel/fs/f2fs -j $(nproc)


Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)

sudo make clean -j $(nproc)      # .configファイルを残す
または
sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する


SUSE 15.3以前の初期設定では、F2FSモジュールはブラックリストに入っている。
F2FSモジュールのブラックリストを解除するため、/etc/modprobe.d/60-blacklist_fs-f2fs.confファイルを編集する。

# SUSE 15.3以前の場合のみ
sudo vi /etc/modprobe.d/60-blacklist_fs-f2fs.conf


# /etc/modprobe.d/60-blacklist_fs-f2fs.confファイル


# 編集前
blacklist f2fs
__THIS FILE MAY BE MODIFIED__

# 編集後
# blacklist f2fs
# __THIS FILE MAY BE MODIFIED__


F2FSモジュールの読み込み (セキュアブートが無効の場合)

F2FSモジュールを読み込む。

sudo depmod -a $(uname -r)


PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。

また、F2FSモジュールが正常に読み込まれているかどうかを確認する場合は、以下のコマンドを実行する。

sudo modinfo f2fs


F2FSモジュールの読み込み (セキュアブートが有効の場合)

セキュアブートが有効の場合、F2FSモジュールの署名を登録する必要がある。

まず、F2FSモジュールの署名に必要な設定ファイルを作成する。

mkdir -p ~/MOK/F2FS && cd ~/MOK/F2FS
vi F2FS.config


 # ~/MOK/F2FS/F2FS.configファイル
 
 [ req ]
 default_bits = 4096
 distinguished_name = req_distinguished_name
 prompt = no
 string_mask = utf8only
 x509_extensions = myexts
 
 [ req_distinguished_name ]
 O = SUSE Linux Products GmbH (User Add F2FS)            # 任意の名前
 CN = SUSE Linux Enterprise Secure Boot (User Add F2FS)  # 任意の名前
 emailAddress = suse@localhost                                # 任意のメールアドレス
 
 [ myexts ]
 basicConstraints=critical,CA:FALSE
 keyUsage=digitalSignature
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid


キーペアを作成する。

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./F2FS.config \
-outform DER -out ./F2FS.der -keyout ./F2FS.priv \
-addext "extendedKeyUsage=codeSigning"


次に、MOK(Module owned Key)にキーをインポートする。
--root-pwオプションを付加することにより、再起動時のF2FSモジュールの署名において、rootパスワードが必要となる。

sudo mokutil --import ./F2FS.der --root-pw


PCを再起動して、上記のキーの署名する。

sudo systemctl reboot


F2FSモジュール(f2fs.ko)を署名する。

sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./F2FS.priv ./F2FS.der /lib/modules/$(uname -r)/kernel/fs/f2fs/f2fs.ko


必要であれば、F2FSモジュールをXZ形式またはZstandard形式に圧縮する。(任意)

# XZ形式の場合
cd /lib/modules/$(uname -r)/kernel/fs/f2fs/
sudo xz -f f2fs.ko

# Zstandard形式の場合
cd /lib/modules/$(uname -r)/kernel/fs/f2fs/
sudo zstd --rm f2fs.ko


F2FSモジュールを読み込む。

sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
sudo modprobe -v f2fs       # F2FSモジュールを読み込む


F2FSモジュールが正常に読み込まれているかどうかを確認する。

lsmod | grep f2fs
# または
sudo modinfo f2fs


F2FSモジュールが正しく署名されているかどうかを確認する。
正常に読み込まれている場合は、"F2FS.der is already enrolled"と表示される。

cd <F2FSモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --test-key ./F2FS.der


上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。

作成したキーは信頼されるため、キーを適切に保存する必要がある。
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。


Linuxカーネルモジュール全体をインストールする方法

Linxuカーネルモジュールのインストール

Linuxカーネルをビルドするために必要なライブラリをインストールする。

sudo zypper install kernel-source


既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。
make olderconfigコマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。

cd /usr/src/linux-<カーネルのバージョン>
sudo make -j $(nproc) olddefconfig O=.


F2FSのビルドを有効にするため、Linuxカーネルのビルド設定を編集する。
TUI画面が起動するので、[File systems] - [F2FS filesystem support]に移動して、[M]キーを押下する。
TUI画面下にある[Save]を選択して、上記の設定を保存する。

sudo make menuconfig -j $(nproc)


カーネルモジュールは、SUSE 15.4の場合はZstandard形式、SUSE 15.3以前の場合はXZ形式に圧縮されている。
セキュアブートが無効の場合は、Linuxカーネルモジュールに圧縮の設定を行ってビルドおよびインストールしてもよい。
もし、Linuxカーネルモジュールに圧縮の設定を行う場合は、以下に示すように、Linuxカーネルのビルドディレクトリにある.configファイルを編集する。

sudo vi /usr/src/linux-<カーネルのバージョン>/.config


  • SUSE 15.4の場合
    "CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT"を検索して、"CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT"の直下に、以下の設定を追記する。
    CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT=y

    "CONFIG_MODULE_COMPRESS"を検索して、"CONFIG_MODULE_COMPRESS"の直下に、以下の設定を追記する。
    CONFIG_MODULE_COMPRESS=y

    "CONFIG_MODULE_COMPRESS_NONE"を検索して、"CONFIG_MODULE_COMPRESS_NONE=y"をコメントアウトする。
    # CONFIG_MODULE_COMPRESS_NONE=y

    "CONFIG_MODULE_COMPRESS_ZSTD"を検索して、"CONFIG_MODULE_COMPRESS_ZSTD"の直下に、以下の設定を追記する。
    CONFIG_MODULE_COMPRESS_ZSTD=y

  • SUSE 15.3以前の場合
    "MODULE_COMPRESS"を検索して、"MODULE_COMPRESS"の直下に、以下の設定を追記する。
    CONFIG_MODULE_COMPRESS=y
    CONFIG_MODULE_COMPRESS_XZ=y


次に、Linuxカーネルをコンパイルする。

sudo make -j $(nproc)


Linuxカーネルモジュールのみをインストールする。
インストールディレクトリは、/lib/modules/<カーネルのバージョン>-defaultディレクトリである。

sudo make modules_install


Linuxカーネルモジュールのインストール後は、以下のコマンドを実行することを推奨する。(ファイル容量が膨大なため)

sudo make clean -j $(nproc)      # .configファイルを残す
または
sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する


SUSE 15.3以前の初期設定では、F2FSモジュールはブラックリストに入っている。
F2FSモジュールのブラックリストを解除するため、/etc/modprobe.d/60-blacklist_fs-f2fs.confファイルを編集する。

# SUSE 15.3以前の場合のみ
sudo vi /etc/modprobe.d/60-blacklist_fs-f2fs.conf


# /etc/modprobe.d/60-blacklist_fs-f2fs.confファイル

# 編集前
blacklist f2fs
__THIS FILE MAY BE MODIFIED__

# 編集後
# blacklist f2fs
# __THIS FILE MAY BE MODIFIED__


※注意 1
もし、VMware WorkStationをインストールしている場合は、併せて、Linuxカーネルヘッダもインストールする必要がある。

sudo make headers_install


Linuxカーネルモジュールの読み込み (セキュアブートが無効の場合)

Linuxカーネルモジュール全体を読み込む。

sudo depmod -a $(uname -r)


PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。
また、F2FSモジュールが正常に読み込まれているかどうかを確認する。

lsmod | grep f2fs
# または
sudo modinfo f2fs


Linuxカーネルモジュールの読み込み (セキュアブートが有効の場合)

セキュアブートが有効の場合、全てのLinuxカーネルモジュールを署名する必要がある。

まず、Linuxカーネルモジュールの署名に必要な設定ファイルを作成する。

mkdir -p ~/MOK/KernelModules && cd ~/MOK/KernelModules
vi KernelModules.config


 # ~/MOK/KernelModules/KernelModules.configファイル
 
 [ req ]
 default_bits = 4096
 distinguished_name = req_distinguished_name
 prompt = no
 string_mask = utf8only
 x509_extensions = myexts
 
 [ req_distinguished_name ]
 O = SUSE Linux Products GmbH (User Add KernelModules)            # 任意の名前
 CN = SUSE Linux Enterprise Secure Boot (User Add KernelModules)  # 任意の名前
 emailAddress = suse@localhost                                    # 任意のメールアドレス
 
 [ myexts ]
 basicConstraints=critical,CA:FALSE
 keyUsage=digitalSignature
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid


キーペアを作成する。

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./KernelModules.config \
-outform DER -out ./KernelModules.der -keyout ./KernelModules.priv \
-addext "extendedKeyUsage=codeSigning"


次に、MOK(Module owned Key)にX509キーをインポートする。
--root-pwオプションを付加することにより、再起動時のLinuxカーネルモジュールの署名において、rootパスワードが必要となる。

sudo mokutil --import ./KernelModules.der --root-pw


PCを再起動して、上記のキーの署名する。

sudo systemctl reboot


全てのLinuxカーネルモジュールを署名して、必要であれば、LinuxカーネルモジュールをXZ形式またはZstandard形式に圧縮する。
ただし、Linuxカーネルモジュールは、ファイル数が膨大なため、以下に示すようなシェルスクリプトを使用する方がよい。

 #!/usr/bin/env bash
 
 # sign-fileファイルのパス
 SIGNFILE="/lib/modules/$(uname -r)/build/scripts/sign-file"
 
 # Linuxカーネルモジュールのキーファイルのパス
 KEYFILE="/home/<ユーザ名>/MOK/KernelModules/KernelModules.priv"
 
 # LinuxカーネルモジュールのX509ファイルのパス
 X509FILE="/home/<ユーザ名>/MOK/KernelModules/KernelModules.der"
 
 DIRECTORY=""
 
 if [ -d "/lib/modules/$(uname -r)/kernel" ]; then
    DIRECTORY=$(find /lib/modules/$(uname -r)/kernel -type f -iname "*.ko*")
 fi
 
 if [ -d "/lib/modules/$(uname -r)/misc" ]; then
    DIRECTORY="${DIRECTORY} $(find /lib/modules/$(uname -r)/misc -type f -iname "*.ko*")"
 fi
 
 if [ -d "/lib/modules/$(uname -r)/extra" ]; then
    DIRECTORY="${DIRECTORY} $(find /lib/modules/$(uname -r)/extra -type f -iname "*.ko*")"
 fi
 
 for module in $DIRECTORY
 do
    module_basename=$(echo ${module} | sed 's/\.[^\.]*$//')
    module_suffix=$(echo ${module} | sed 's/^.*\.\([^\.]*\)$/\1/')
 
    if [[ "$module_suffix" == "xz" ]]; then
       sudo unxz $module
       echo "${SIGNFILE} sha256 ${KEYFILE} ${X509FILE} ${module_basename}"
       sudo "${SIGNFILE}" sha256 "${KEYFILE}" "${X509FILE}" "${module_basename}"
       sudo xz -f ${module_basename}
    elif [[ "$module_suffix" == "gz" ]]; then
       sudo gunzip $module
       echo "${SIGNFILE} sha256 ${KEYFILE} ${X509FILE} ${module_basename}"
       sudo "${SIGNFILE}" sha256 "${KEYFILE}" "${X509FILE}" "${module_basename}"
       sudo gzip -9f $module_basename
    elif [[ "$module_suffix" == "zst" ]]; then
       sudo zstd -d --rm $module
       echo "${SIGNFILE} sha256 ${KEYFILE} ${X509FILE} ${module_basename}"
       sudo "${SIGNFILE}" sha256 "${KEYFILE}" "${X509FILE}" "${module_basename}"
       sudo zstd --rm    "${module_basename}"
    else
       echo "${SIGNFILE} sha256 ${KEYFILE} ${X509FILE} ${module_basename}"
       sudo "${SIGNFILE}" sha256 "${KEYFILE}" "${X509FILE}" "${module_basename}"
    fi
 done


全てのLinuxカーネルモジュールを読み込む。

sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
sudo modprobe -v f2fs       # Linuxカーネルモジュールを読み込む


F2FSモジュールが正常に読み込まれているかどうかを確認する。

lsmod | grep f2fs
# または
sudo modinfo f2fs


Linuxカーネルモジュールが正しく署名されているかどうかを確認する。
正常に読み込まれている場合は、"KernelModules.der is already enrolled"と表示される。

cd <Linuxカーネルモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --test-key ./KernelModules.der


上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。

作成したキーは信頼されるため、キーを適切に保存する必要がある。
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。

Linuxカーネルをアップデートした場合

Linuxカーネルをアップデートした場合、F2FSモジュールが使用できなくなるため、再度、F2FSモジュールをインストールする必要がある。
もし、F2FSモジュールのバックアップが存在する場合、F2FSモジュールを規定のディレクトリにコピーして、Linuxカーネルモジュールを読み込むこともできる。

# Linuxカーネルモジュール群の読み込み
sudo depmod -a $(uname -r)


ただし、セキュアブートが有効の場合は、上記の"Linuxカーネルモジュールの読み込み (セキュアブートが有効の場合)"セクションの手順を実行する必要がある。


DKMSの使用

F2FSカーネルモジュールにおいて、DKMSを使用して自動的にビルドおよびインストールする。

F2FSカーネルモジュールのソースコードをインストールする。

# SUSE
sudo zypper install kernel-source


F2FSカーネルモジュールのDKMSの設定ファイルを作成する。

sudo mkdir -p /usr/src/f2fs-1.0
sudo vi /usr/src/f2fs/dkms.conf


# /usr/src/f2fs-1.0/dkms.confファイル

PACKAGE_NAME="f2fs"
PACKAGE_VERSION="1.0"
CLEAN="make clean"
MAKE="make"
BUILT_MODULE_NAME[0]="f2fs"

# /lib/modules/<カーネルバージョン>/kernel/fs/f2fsディレクトリにインストールする
DEST_MODULE_LOCATION[0]="/kernel/fs/f2fs"

# 特定のコンパイルフラグやオプションが必要な場合
# CONFIG_F2FS_FS=m           : F2FSをモジュールとしてビルド
# CONFIG_F2FS_STAT_FS=y      : F2FSの統計情報サポートを有効化
# CONFIG_F2FS_FS_XATTR=y     : 拡張属性のサポートを有効化
# CONFIG_F2FS_FS_POSIX_ACL=y : POSIX ACLのサポートを有効化
MAKE_ARGS="CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y"

AUTOINSTALL="yes"


F2FSカーネルモジュールのソースコードを、DKMSの設定ファイルと同階層のディレクトリにコピーする。

sudo cp -r /usr/src/linux-$(uname -r)/fs/f2fs /usr/src/f2fs-1.0


DKMSを使用して、F2FSカーネルモジュールをビルドおよびインストールする。

sudo dkms add f2fs/1.0      または  sudo dkms add -m f2fs -v 1.0
sudo dkms build f2fs/1.0    または  sudo dkms build -m f2fs -v 1.0
sudo dkms install f2fs/1.0  または  sudo dkms install -m f2fs -v 1.0


モジュールがロードされていることを確認する。

lsmod | grep f2fs


これにより、f2fsカーネルモジュールがDKMSにより自動的にビルドおよびインストールされる。
Linuxカーネルがアップデートされた場合でも、DKMSが自動的にカーネルモジュールを再ビルドするため、手動でカーネルモジュールを再インストールする必要はない。

ただし、カーネルモジュールのソースコードが更新された場合は、最新のソースコードをダウンロードして、該当するDKMSの設定ファイルがある同階層のディレクトリにコピーする必要がある。


F2FS Toolのインストール

パッケージ管理システムからインストール

sudo zypper install f2fs-tools


ソースコードからインストール

F2FS Toolsのビルドに必要な依存関係のライブラリをインストールする。

sudo zypper install libuuid-devel pkg-config autoconf libtool libselinux-devel


LinuxカーネルのF2FS ToolsのWebサイトから、タグが"vX.Y.Z"のソースコードをダウンロードする。
または、以下のコマンドを実行して、ソースコードをダウンロードする。

git clone https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git -b master
cd f2fs-tools


ダウンロードしたファイルを解凍する。

tar xf f2fs-tools-<バージョン>.tar.gz
cd f2fs-tools-<バージョン>


Configureスクリプトを作成する。

./autogen.sh


F2FS Toolsをビルドおよびインストールする。
この時、ビルドディレクトリは作成しない。(作成した場合、ビルドが失敗する)

./configure --prefix=<F2FS Toolsのインストールディレクトリ>
make -j $(nproc)
make install


F2FS Toolsの使用するコマンドを以下に示す。

mkfs.f2fs -l <ラベル名> /dev/sdX
# または
sudo mkfs.f2fs -l <ラベル名> /dev/sdX