「インストール - F2FS」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

 
(同じ利用者による、間の25版が非表示)
7行目: 7行目:


== F2FSモジュールのみインストールする方法 (推奨) ==
== F2FSモジュールのみインストールする方法 (推奨) ==
Linuxカーネルのソースコードをダウンロード、または、インストールする。<br>
==== F2FSモジュールのソースコードのダウンロード ====
Linuxカーネルのソースコードをダウンロードする。<br>
* パッケージ管理システムから、Linuxカーネルのソースコードをインストールする場合
* パッケージ管理システムから、Linuxカーネルのソースコードをインストールする場合
*: <code>sudo zypper install kernel-source</code>
*: <code>sudo zypper install kernel-source</code>
18行目: 19行目:
*: <code>cd linux-<バージョン></code>
*: <code>cd linux-<バージョン></code>
<br>
<br>
<u>SUSE15.4かつパッケージ管理システムからLinuxカーネル(5.14.21-150400.22)のソースコードを取得した場合、</u><br>
==== F2FSモジュールのソースコードの修正 : SLE 15 SP4 / openSUSE Leap 15.4のみ ====
<u>F2FSのソースコードの一部にバグが存在するため、以下に示すようにソースコードを修正する必要がある。</u><br>
<u>SLE 15 SP4 / openSUSE Leap 15.4において、パッケージ管理システムからLinuxカーネル 5.14.21-150400.22のソースコードを使用する場合、</u><br>
<u>F2FSのソースコードの一部にリグレッション(デグレード)が発生しているため、F2FSのソースコードを修正する必要がある。</u><br>
  sudo vi /usr/src/linux-5.14.21-150400.22/fs/f2fs/file.c
  sudo vi /usr/src/linux-5.14.21-150400.22/fs/f2fs/file.c
<br>
<br>
32行目: 34行目:
  1101行目 : filemap_invalidate_lock(inode->i_mapping)
  1101行目 : filemap_invalidate_lock(inode->i_mapping)
<br>
<br>
==== F2FSモジュールのインストール ====
既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。<br>
既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。<br>
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。<br>
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。<br>
  make -j $(nproc) olddefconfig O=.
  make -j $(nproc) olddefconfig O=.
# または
sudo make -j $(nproc) olddefconfig O=.
<br>
<br>
F2FSのビルド設定を行うため、<code>make menuconfig</code>コマンドを実行する。<br>
F2FSのビルド設定を行うため、<code>make menuconfig</code>コマンドを実行する。<br>
44行目: 49行目:
TUI画面下にある[Save]を選択して、上記の設定を保存する。<br>
TUI画面下にある[Save]を選択して、上記の設定を保存する。<br>
<br>
<br>
Zstd形式に圧縮する場合、[Linux Kernel Configuration] - [File systems] - [Miscellaneous filesystems] - [Include support for ZSTD compressed file systems]に移動して、[M]キーを押下する。<br>
<u>セキュアブートが無効の場合は、Linuxカーネルモジュールに圧縮の設定を行ってビルドおよびインストールしてもよい。</u><br>
また、[Linux Kernel Configuration] - [Library routines] - [ZSTD_COMPRESS]に移動して、[M]キーを押下する。<br>
もし、Linuxカーネルモジュールに圧縮の設定を行う場合は、以下に示すように、Linuxカーネルのビルドディレクトリにある.configファイルを編集する。<br>
sudo vi /usr/src/linux-<カーネルのバージョン>/.config
<br>
* SUSE 15.4の場合
*: 以下の設定を追記する。
*: <code># /usr/src/linux-<カーネルのバージョン>/.configファイル</code>
*: <code>CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT=y  # 新しく追加する</code>
*: <code>CONFIG_MODULE_COMPRESS=y  # 新しく追加する</code>
*: <code># CONFIG_MODULE_COMPRESS_NONE=n  # コメントアウトする</code>
*: <code>CONFIG_MODULE_COMPRESS_ZSTD=y  # 新しく追加する</code>
*: <br>  
* SUSE 15.3以前の場合
*: "MODULE_COMPRESS"を検索して、"MODULE_COMPRESS"の直下に、以下の設定を追記する。
*: <code># /usr/src/linux-<カーネルのバージョン>/.configファイル</code>
*: <code>CONFIG_MODULE_COMPRESS=y</code>
*: <code>CONFIG_MODULE_COMPRESS_XZ=y</code>
<br>
<br>
Linuxカーネルから、F2FSのみをビルドする。<br>
Linuxカーネルから、F2FSのみをビルドする。<br>
  make scripts prepare modules_prepare -j $(nproc)
<br>
  make -C . M=fs/f2fs -j $(nproc)
* INSTALL_MOD_DIRオプション
*: 一般的に、カーネルモジュールは、/lib/modules/$(uname -r)/extraディレクトリにインストールされる。
*: 任意のディレクトリに配置したい場合、<code>INSTALL_MOD_DIR</code>オプションを付加して、extraディレクトリに代わるパスを指定する。
*: 例えば、<code>INSTALL_MOD_DIR=fs/f2fs</code>と指定する場合、インストールディレクトリは<code>/lib/modules/$(uname -r)/fs/f2fs</code>ディレクトリとなる。
  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 scripts prepare modules_prepare -j $(nproc)
  sudo make prepare -j $(nproc)
  sudo make -C . M=fs/f2fs -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)
<br>
<br>
<u>セキュアブートが無効の場合は、F2FSモジュールを圧縮してもよい。</u><br>
Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)<br>
* SUSE 15.4の場合
sudo make clean -j $(nproc)      # .configファイルを残す
*: 生成したf2fs.koファイルをZstandard形式に圧縮する。
または
*: <code>cd fs/f2fs</code>
sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する
*: <code>zstd f2fs.ko -o f2fs.ko.zst</code>
*: <br>
* SUSE 15.0 - SUSE 15.3の場合
*: 生成したf2fs.koファイルをXZ形式に圧縮する。
*: <code>cd fs/f2fs</code>
*: <code>xz -kv f2fs.ko</code>
<br>
<br>
<u>SUSE 15.3以前の初期設定では、F2FSモジュールはブラックリストに入っている。</u><br>
<u>SUSE 15.3以前の初期設定では、F2FSモジュールはブラックリストに入っている。</u><br>
82行目: 107行目:
  # __THIS FILE MAY BE MODIFIED__
  # __THIS FILE MAY BE MODIFIED__
<br>
<br>
/lib/modules/<使用しているLinuxカーネルのバージョン>/kernel/fs/f2fsディレクトリを作成して、F2FSモジュールをコピーする。<br>
 
sudo mkdir /lib/modules/$(uname -r)/kernel/fs/f2fs
==== F2FSモジュールの読み込み (セキュアブートが無効の場合) ====
sudo cp f2fs.ko /lib/modules/$(uname -r)/kernel/fs/f2fs
F2FSモジュールを読み込む。<br>
<br>
F2FSモジュールをデプロイする。<br>
  sudo depmod -a $(uname -r)
  sudo depmod -a $(uname -r)
<br>
<br>
PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。<br>
PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。<br>
<br>
<br>
また、F2FSモジュールが正常に読み込まれているかどうかを確認するには、以下のコマンドを実行する。<br>
また、F2FSモジュールが正常に読み込まれているかどうかを確認する場合は、以下のコマンドを実行する。<br>
  sudo modinfo f2fs
  sudo modinfo f2fs
<br>
<br>
Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)<br>
==== F2FSモジュールの読み込み (セキュアブートが有効の場合) ====
  sudo make clean -j $(nproc)     # .configファイルを残す
セキュアブートが有効の場合、F2FSモジュールの署名を登録する必要がある。<br>
  または
<br>
  sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する
まず、F2FSモジュールの署名に必要な設定ファイルを作成する。<br>
mkdir -p ~/MOK/F2FS && cd ~/MOK/F2FS
vi F2FS.config
<br>
<syntaxhighlight lang="ini">
# ~/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
</syntaxhighlight>
<br>
キーペアを作成する。<br>
openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./F2FS.config \
-outform DER -out ./F2FS.der -keyout ./F2FS.priv \
-addext "extendedKeyUsage=codeSigning"
<br>
次に、MOK(Module owned Key)にキーをインポートする。<br>
<code>--root-pw</code>オプションを付加することにより、再起動時のF2FSモジュールの署名において、rootパスワードが必要となる。<br>
  sudo mokutil --import ./F2FS.der --root-pw
<br>
PCを再起動して、上記のキーの署名する。<br>
sudo systemctl reboot
<br>
F2FSモジュール(f2fs.ko)を署名する。<br>
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./F2FS.priv ./F2FS.der /lib/modules/$(uname -r)/kernel/fs/f2fs/f2fs.ko
<br>
必要であれば、F2FSモジュールをXZ形式またはZstandard形式に圧縮する。(任意)<br>
# 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
<br>
F2FSモジュールを読み込む。<br>
  sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
sudo modprobe -v f2fs      # F2FSモジュールを読み込む
<br>
F2FSモジュールが正常に読み込まれているかどうかを確認する。<br>
lsmod | grep f2fs
# または
sudo modinfo f2fs
<br>
F2FSモジュールが正しく署名されているかどうかを確認する。<br>
正常に読み込まれている場合は、<u>"F2FS.der is already enrolled"</u>と表示される。<br>
cd <F2FSモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --test-key ./F2FS.der
<br>
上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。<br>
<br>
作成したキーは信頼されるため、キーを適切に保存する必要がある。<br>
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。<br>
<br><br>
<br><br>


== カーネルモジュール全体をインストールする方法 ==
== Linuxカーネルモジュール全体をインストールする方法 ==
==== Linxuカーネルモジュールのインストール ====
Linuxカーネルをビルドするために必要なライブラリをインストールする。<br>
Linuxカーネルをビルドするために必要なライブラリをインストールする。<br>
  sudo zypper install kernel-source
  sudo zypper install kernel-source
<br>
<br>
/usr/src/linux-<カーネルのバージョン>ディレクトリに移動して、以下のコマンドを実行する。<br>
既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。<br>
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。
  cd /usr/src/linux-<カーネルのバージョン>
  cd /usr/src/linux-<カーネルのバージョン>
  sudo make menuconfig -j $(nproc)
  sudo make -j $(nproc) olddefconfig O=.
<br>
<br>
F2FSのビルドを有効にするため、Linuxカーネルのビルド設定を編集する。<br>
TUI画面が起動するので、[File systems] - [F2FS filesystem support]に移動して、[M]キーを押下する。<br>
TUI画面が起動するので、[File systems] - [F2FS filesystem support]に移動して、[M]キーを押下する。<br>
TUI画面下にある[Save]を選択して、上記の設定を保存する。<br>
TUI画面下にある[Save]を選択して、上記の設定を保存する。<br>
sudo make menuconfig -j $(nproc)
<br>
<br>
SUSE15.3以前の場合、カーネルモジュールは、XZ形式に圧縮されている。<br>
カーネルモジュールは、SUSE 15.4の場合はZstandard形式、SUSE 15.3以前の場合はXZ形式に圧縮されている。<br>
圧縮を有効にするには、.configファイルに<code>MODULE_COMPRESS_GZIP=y</code>オプションまたは<code>MODULE_COMPRESS_XZ=y</code>オプションを追記する必要がある。<br>
<u>セキュアブートが無効の場合は、Linuxカーネルモジュールに圧縮の設定を行ってビルドおよびインストールしてもよい。</u><br>
<u>(この設定は必須ではないが、SUSEの標準では、カーネルモジュールはXZ形式に圧縮されているため)</u><br>
もし、Linuxカーネルモジュールに圧縮の設定を行う場合は、以下に示すように、Linuxカーネルのビルドディレクトリにある.configファイルを編集する。<br>
<br>
まず、Linuxカーネルのビルドディレクトリの.configファイルを開いて、"<u>MODULE_COMPRESS</u>"を検索する。<br>
検索した"<u>MODULE_COMPRESS</u>"の直下に、以下の設定を追記する。<br>
  sudo vi /usr/src/linux-<カーネルのバージョン>/.config
  sudo vi /usr/src/linux-<カーネルのバージョン>/.config
<br>
<br>
* SUSE 15.4の場合
* SUSE 15.4の場合
*: 以下の設定を追記する。
*: "CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT"を検索して、"CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT"の直下に、以下の設定を追記する。
*: <code># /usr/src/linux-<カーネルのバージョン>/.configファイル</code>
*: <code># ...略</code>
*: <code>CONFIG_SQUASHFS_ZSTD=y</code>
*: <code>CONFIG_PSTORE_ZSTD_COMPRESS=y</code>
*: <code>CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT=y</code>
*: <code>CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT=y</code>
*: <code>CONFIG_CRYPTO_ZSTD=y</code>
*: <br>
*: <code>CONFIG_ZSTD_COMPRESS=y</code>
*: "CONFIG_MODULE_COMPRESS"を検索して、"CONFIG_MODULE_COMPRESS"の直下に、以下の設定を追記する。
*: <code>CONFIG_ZSTD_DECOMPRESS=y</code>
*: <code>CONFIG_MODULE_COMPRESS=y</code>
*: <br>
*: "CONFIG_MODULE_COMPRESS_NONE"を検索して、"CONFIG_MODULE_COMPRESS_NONE=y"をコメントアウトする。
*: <code># CONFIG_MODULE_COMPRESS_NONE=y</code>
*: <br>
*: "CONFIG_MODULE_COMPRESS_ZSTD"を検索して、"CONFIG_MODULE_COMPRESS_ZSTD"の直下に、以下の設定を追記する。
*: <code>CONFIG_MODULE_COMPRESS_ZSTD=y</code>
*: <code>CONFIG_MODULE_COMPRESS_ZSTD=y</code>
*: <code># ...略</code>
*: <br>  
*: <br>  
* SUSE 15.0 - SUSE 15.3
* SUSE 15.3以前の場合
*: "MODULE_COMPRESS"を検索して、"MODULE_COMPRESS"の直下に、以下の設定を追記する。
*: "MODULE_COMPRESS"を検索して、"MODULE_COMPRESS"の直下に、以下の設定を追記する。
*: <code># /usr/src/linux-<カーネルのバージョン>/.configファイル</code>
*: <code># ...略</code>
*: <code>CONFIG_MODULE_COMPRESS=y</code>
*: <code>CONFIG_MODULE_COMPRESS=y</code>
*: <code>CONFIG_MODULE_COMPRESS_XZ=y</code>
*: <code>CONFIG_MODULE_COMPRESS_XZ=y</code>
*: <code># ...略</code>
<br>
<br>
<br>
次に、Linuxカーネルをコンパイルする。<br>
次に、Linuxカーネルをコンパイルする。<br>
148行目: 235行目:
  sudo make modules_install
  sudo make modules_install
<br>
<br>
最後に、/etc/modprobe.dディレクトリにある60-blacklist_fs-f2fs.confファイルを、以下のように編集する。<br>
Linuxカーネルモジュールのインストール後は、以下のコマンドを実行することを推奨する。(ファイル容量が膨大なため)<br>
sudo make clean -j $(nproc)      # .configファイルを残す
または
sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する
<br>
SUSE 15.3以前の初期設定では、F2FSモジュールはブラックリストに入っている。<br>
F2FSモジュールのブラックリストを解除するため、/etc/modprobe.d/60-blacklist_fs-f2fs.confファイルを編集する。<br>
# SUSE 15.3以前の場合のみ
  sudo vi /etc/modprobe.d/60-blacklist_fs-f2fs.conf
  sudo vi /etc/modprobe.d/60-blacklist_fs-f2fs.conf
<br>
<br>
160行目: 254行目:
  # blacklist f2fs
  # blacklist f2fs
  # __THIS FILE MAY BE MODIFIED__
  # __THIS FILE MAY BE MODIFIED__
<br>
PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。<br>
<br>
<br>
<u>※注意 1</u><br>
<u>※注意 1</u><br>
<u>Linuxカーネルをアップデートした場合は自動的にF2FSモジュールが削除されるため、再度、F2FSモジュールをインストールする必要がある。</u><br>
<u>もし、既にF2FSモジュールのバックアップが存在する場合、f2fs.ko.xzファイルを以下のディレクトリにコピーして、モジュール群をデプロイすることもできる。</u><br>
# F2FSモジュールのコピー
sudo mkdir /lib/modules/$(uname -r)/kernel/fs/f2fs/
sudo cp f2fs.ko.xz /lib/modules/$(uname -r)/kernel/fs/f2fs/
# モジュール群のデプロイ
sudo depmod -a $(uname -r)
<br>
<u>※注意 2</u><br>
<u>もし、VMware WorkStationをインストールしている場合は、併せて、Linuxカーネルヘッダもインストールする必要がある。</u><br>
<u>もし、VMware WorkStationをインストールしている場合は、併せて、Linuxカーネルヘッダもインストールする必要がある。</u><br>
  sudo make headers_install
  sudo make headers_install
<br>
<br>
Linuxカーネルモジュールのインストール後は、以下のコマンドを実行することを推奨する。(ファイル容量が膨大なため)<br>
==== Linuxカーネルモジュールの読み込み (セキュアブートが無効の場合) ====
  sudo make clean -j $(nproc)      # .configファイルを残す
Linuxカーネルモジュール全体を読み込む。<br>
または
  sudo depmod -a $(uname -r)
sudo make distclean -j $(nproc) # .configファイル等の設定ファイルを全て削除する
<br>
<br><br>
PCを再起動して、F2FSファイルシステムが正常にマウントできるかどうか確認する。<br>
 
また、F2FSモジュールが正常に読み込まれているかどうかを確認する。<br>
== F2FSモジュールの署名 (セキュアブートが有効の場合) ==
lsmod | grep f2fs
==== SUSE 15.4 ====
# または
セキュアブートが有効の場合、F2FSモジュールの署名を登録する必要がある。<br>
sudo modinfo f2fs
<u>また、ユーザが勝手にモジュールファイルをZstandard形式等へ圧縮してはならない。(モジュールの署名に失敗するため)</u><br>
<br>
<br>
署名を登録する手順を以下に示す。<br>
==== Linuxカーネルモジュールの読み込み (セキュアブートが有効の場合) ====
セキュアブートが有効の場合、全てのLinuxカーネルモジュールを署名する必要がある。<br>
<br>
<br>
まず、署名に必要な設定ファイルを作成する。<br>
まず、Linuxカーネルモジュールの署名に必要な設定ファイルを作成する。<br>
  mkdir -p ~/MOK/F2FS && cd ~/MOK/F2FS
  mkdir -p ~/MOK/KernelModules && cd ~/MOK/KernelModules
  vi F2FS.config
  vi KernelModules.config
<br>
<br>
  # ~/MOK/F2FS/F2FS.configファイル
<syntaxhighlight lang="ini">
  # ~/MOK/KernelModules/KernelModules.configファイル
   
   
  [ req ]
  [ req ]
204行目: 287行目:
   
   
  [ req_distinguished_name ]
  [ req_distinguished_name ]
  O = SUSE Linux Products GmbH (User Add F2FS)            # 任意の名前
  O = SUSE Linux Products GmbH (User Add KernelModules)            # 任意の名前
  CN = SUSE Linux Enterprise Secure Boot (User Add F2FS)  # 任意の名前
  CN = SUSE Linux Enterprise Secure Boot (User Add KernelModules)  # 任意の名前
  emailAddress = suse@localhost                               # 任意のメールアドレス
  emailAddress = suse@localhost                                   # 任意のメールアドレス
   
   
  [ myexts ]
  [ myexts ]
213行目: 296行目:
  subjectKeyIdentifier=hash
  subjectKeyIdentifier=hash
  authorityKeyIdentifier=keyid
  authorityKeyIdentifier=keyid
</syntaxhighlight>
<br>
<br>
キーペアを作成する。<br>
キーペアを作成する。<br>
  openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./F2FS.config \
  openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./KernelModules.config \
  -outform DER -out ./F2FS.der -keyout ./F2FS.priv \
  -outform DER -out ./KernelModules.der -keyout ./KernelModules.priv \
  -addext "extendedKeyUsage=codeSigning"
  -addext "extendedKeyUsage=codeSigning"
<br>
<br>
次に、MOK(Module owned Key)にキーをインポートする。<br>
次に、MOK(Module owned Key)にX509キーをインポートする。<br>
<code>--root-pw</code>オプションを付加することにより、再起動時のF2FSモジュールの署名において、rootパスワードが必要となる。<br>
<code>--root-pw</code>オプションを付加することにより、再起動時のLinuxカーネルモジュールの署名において、rootパスワードが必要となる。<br>
  sudo mokutil --import ./F2FS.der --root-pw
  sudo mokutil --import ./KernelModules.der --root-pw
<br>
<br>
PCを再起動して、上記のキーの署名する。<br>
PCを再起動して、上記のキーの署名する。<br>
  sudo systemctl reboot
  sudo systemctl reboot
<br>
<br>
F2FSモジュール(f2fs.ko)を署名して、モジュールを読み込む。<br>
全てのLinuxカーネルモジュールを署名して、必要であれば、LinuxカーネルモジュールをXZ形式またはZstandard形式に圧縮する。<br>
  sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./F2FS.priv ./F2FS.der /lib/modules/$(uname -r)/kernel/fs/f2fs/f2fs.ko
<u>ただし、Linuxカーネルモジュールは、ファイル数が膨大なため、以下に示すようなシェルスクリプトを使用する方がよい。</u><br>
  <syntaxhighlight lang="bash">
#!/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
</syntaxhighlight>
<br>
全てのLinuxカーネルモジュールを読み込む。<br>
  sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
  sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
  sudo modprobe -v f2fs      # F2FSモジュールをロードする
  sudo modprobe -v f2fs      # Linuxカーネルモジュールを読み込む
  lsmod | grep f2fs           # 正常に読み込まれたかどうかを確認する
<br>
F2FSモジュールが正常に読み込まれているかどうかを確認する。<br>
  lsmod | grep f2fs
# または
sudo modinfo f2fs
<br>
<br>
F2FSモジュールが正しく署名されているかどうかを確認する。<br>
Linuxカーネルモジュールが正しく署名されているかどうかを確認する。<br>
正常に読み込まれている場合は、<u>"F2FS.der is already enrolled"</u>と表示される。<br>
正常に読み込まれている場合は、<u>"KernelModules.der is already enrolled"</u>と表示される。<br>
  cd <F2FSモジュールの署名ファイルが存在するディレクトリ>
  cd <Linuxカーネルモジュールの署名ファイルが存在するディレクトリ>
  sudo mokutil --test-key ./F2FS.der
  sudo mokutil --test-key ./KernelModules.der
<br>
<br>
上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。<br>
上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。<br>
242行目: 384行目:
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。<br>
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。<br>
<br>
<br>
==== Linuxカーネルをアップデートした場合 ====
Linuxカーネルをアップデートした場合、F2FSモジュールが使用できなくなるため、再度、F2FSモジュールをインストールする必要がある。<br>
もし、F2FSモジュールのバックアップが存在する場合、F2FSモジュールを規定のディレクトリにコピーして、Linuxカーネルモジュールを読み込むこともできる。<br>
# Linuxカーネルモジュール群の読み込み
sudo depmod -a $(uname -r)
<br>
<u>ただし、セキュアブートが有効の場合は、上記の"[[インストール - F2FS#Linuxカーネルモジュールの読み込み (セキュアブートが有効の場合)|Linuxカーネルモジュールの読み込み (セキュアブートが有効の場合)]]"セクションの手順を実行する必要がある。</u><br>
<br><br>
== DKMSの使用 ==
F2FSカーネルモジュールにおいて、DKMSを使用して自動的にビルドおよびインストールする。<br>
<br>
F2FSカーネルモジュールのソースコードをインストールする。<br>
# SUSE
sudo zypper install kernel-source
<br>
F2FSカーネルモジュールのDKMSの設定ファイルを作成する。<br>
sudo mkdir -p /usr/src/f2fs-1.0
sudo vi /usr/src/f2fs/dkms.conf
<br>
# /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"
<br>
F2FSカーネルモジュールのソースコードを、DKMSの設定ファイルと同階層のディレクトリにコピーする。<br>
sudo cp -r /usr/src/linux-$(uname -r)/fs/f2fs /usr/src/f2fs-1.0
<br>
DKMSを使用して、F2FSカーネルモジュールをビルドおよびインストールする。<br>
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
<br>
モジュールがロードされていることを確認する。<br>
lsmod | grep f2fs
<br>
これにより、f2fsカーネルモジュールがDKMSにより自動的にビルドおよびインストールされる。<br>
Linuxカーネルがアップデートされた場合でも、DKMSが自動的にカーネルモジュールを再ビルドするため、手動でカーネルモジュールを再インストールする必要はない。<br>
<br>
ただし、カーネルモジュールのソースコードが更新された場合は、最新のソースコードをダウンロードして、該当するDKMSの設定ファイルがある同階層のディレクトリにコピーする必要がある。<br>
<br><br>
== F2FS Toolのインストール ==
== F2FS Toolのインストール ==
* パッケージ管理システムからインストール
==== パッケージ管理システムからインストール ====
*# <code>sudo zypper install f2fs-tools</code>
sudo zypper install f2fs-tools
*: <br>
<br>
* ソースコードからインストール
==== ソースコードからインストール ====
*# F2FS Toolsのビルドに必要な依存関係のライブラリをインストールする。
F2FS Toolsのビルドに必要な依存関係のライブラリをインストールする。<br>
*#: <code>sudo zypper install libuuid-devel pkg-config autoconf libtool libselinux-devel </code>
sudo zypper install libuuid-devel pkg-config autoconf libtool libselinux-devel
*# [https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/ LinuxカーネルのF2FS ToolsのWebサイト]から、タグが"vX.Y.Z"のソースコードをダウンロードする。<br>または、以下のコマンドを実行して、ソースコードをダウンロードする。
<br>
*#: <code>git clone https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git -b master</code>
[https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/ LinuxカーネルのF2FS ToolsのWebサイト]から、タグが"vX.Y.Z"のソースコードをダウンロードする。<br>
*#: <code>cd f2fs-tools</code>
または、以下のコマンドを実行して、ソースコードをダウンロードする。<br>
*# ダウンロードしたファイルを解凍する必要があれば行う。
git clone https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git -b master
*#: <code>tar xf f2fs-tools-1.14.0.tar.gz</code>
cd f2fs-tools
*#: <code>cd f2fs-tools-1.14.0</code>
<br>
*# Configureスクリプトを作成する。
ダウンロードしたファイルを解凍する。<br>
*#: <code>./autogen.sh</code>
tar xf f2fs-tools-<バージョン>.tar.gz
*# F2FS Toolsをビルドおよびインストールする。<br>この時、ビルドディレクトリは作成しない。(作成した場合、ビルドが失敗する)
cd f2fs-tools-<バージョン>
*#: <code>./configure --prefix=<F2FS Toolsのインストールディレクトリ></code>
<br>
*#: <code>make -j $(nproc)</code>
Configureスクリプトを作成する。
*#: <code>make install</code>
./autogen.sh
<br>
F2FS Toolsをビルドおよびインストールする。<br>
この時、ビルドディレクトリは作成しない。(作成した場合、ビルドが失敗する)<br>
./configure --prefix=<F2FS Toolsのインストールディレクトリ>
make -j $(nproc)
make install
<br>
<br>
F2FS Toolsの使用するコマンドを以下に示す。<br>
F2FS Toolsの使用するコマンドを以下に示す。<br>
267行目: 473行目:
  sudo mkfs.f2fs -l <ラベル名> /dev/sd<span style="color:#C00000">X</span>
  sudo mkfs.f2fs -l <ラベル名> /dev/sd<span style="color:#C00000">X</span>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:SUSE]]
[[カテゴリ:SUSE]]

2024年6月26日 (水) 01:52時点における最新版

概要

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