インストール - F2FS
概要
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