4
2

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 3 years have passed since last update.

Raspberry Pi 起動時にfsck実行

Posted at

序文

Right way to fsck_repair root partition - Raspberry Pi Forums

If a file named "fsck" is present in "/" then fsck will be run on boot before "/" is remounted read/write.
so

sudo touch /fsck

and

sudo reboot

should be enough.

これは確かにLinuxにおける昔からよく知られた方法。しかしRaspberry Pi環境で実行してもfsckは動いていないっぽい。ログファイルも/var/log/fsck配下に出力される筈だが、ディレクトリ自体存在しない。
自分もここら辺の理解がぼんやりしていて再確認してみたので備忘録として残す。

結論

起動システムによる。

  • init - Wikipedia
    UNIXを始祖とする。この場合、冒頭の方法が正。
  • systemd - Wikipedia
    上記initを置き換える目的として導入された。現在のDebianはこちらを採用していて、結果Raspberry Pi OSも同様。この場合は以下。
    /boot/cmdline.txtfsck.mode=forceを追記し再起動。systemd-fsckサービスによりfsckが実行される。
pi@raspberrypi4:~ $ cat /boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=91029070-02 rootfstype=ext4 fsck.mode=force fsck.repair=yes rootwait video=HDMI-A-1:1280x720@60D
pi@raspberrypi4:~ $

最初からfsck.repair=yesが設定されていることが確認できる。これについて、起動時に必ずfsckをかける設定という説明を見かけたことがあるが間違い。これはfsck実行時の挙動を指定している。明示的に起動時にfsck実行の指定がなくても、システムが判断して実行される場合もあるからね。詳細は公式ドキュメント参照。

systemd-fsck@.service(8) — systemd — Debian bullseye — Debian Manpages

systemd-fsck understands these kernel command line parameters:

fsck.mode=

One of "auto", "force", "skip". Controls the mode of operation. The default is "auto", and ensures that file system checks are done when the file system checker deems them necessary. "force" unconditionally results in full file system checks. "skip" skips any file system checks.

fsck.repair=

One of "preen", "yes", "no". Controls the mode of operation. The default is "preen", and will automatically repair problems that can be safely fixed. "yes" will answer yes to all questions by fsck and "no" will answer no to all questions.

systemd関連のログはjournalctlコマンドで確認するのが作法なので、fsckの場合も以下。

pi@raspberrypi4:~ $ journalctl -u systemd-fsck*
(中略)
 3月 09 21:37:51 raspberrypi4 systemd[1]: systemd-fsck@dev-disk-by\x2dpartuuid-91029070\x2d01.service: Succeeded.
 3月 09 21:37:51 raspberrypi4 systemd[1]: Stopped File System Check on /dev/disk/by-partuuid/91029070-01.
 3月 09 21:37:51 raspberrypi4 systemd[1]: systemd-fsck-root.service: Succeeded.
 3月 09 21:37:51 raspberrypi4 systemd[1]: Stopped File System Check on Root Device.
 3月 09 21:37:51 raspberrypi4 systemd[1]: systemd-fsck-root.service: Consumed 3.084s CPU time.
-- Boot d69fb2cf1ae1445aa7b1876e30d275b0 --
 3月 09 21:37:51 raspberrypi4 systemd-fsck[152]: e2fsck 1.46.2 (28-Feb-2021)
 3月 09 21:37:51 raspberrypi4 systemd-fsck[152]: Pass 1: Checking inodes, blocks, and sizes
 3月 09 21:37:52 raspberrypi4 systemd-fsck[152]: Pass 2: Checking directory structure
 3月 09 21:37:54 raspberrypi4 systemd-fsck[152]: Pass 3: Checking directory connectivity
 3月 09 21:37:54 raspberrypi4 systemd-fsck[152]: Pass 4: Checking reference counts
 3月 09 21:37:54 raspberrypi4 systemd-fsck[152]: Pass 5: Checking group summary information
 3月 09 21:37:54 raspberrypi4 systemd-fsck[152]: rootfs: 111962/450560 files (0.1% non-contiguous), 1248929/1792000 blocks
 3月 09 21:37:54 raspberrypi4 systemd[1]: Finished File System Check on Root Device.
 3月 09 21:37:56 raspberrypi4 systemd[1]: Starting File System Check on /dev/disk/by-partuuid/91029070-01...
 3月 09 21:37:56 raspberrypi4 systemd-fsck[345]: fsck.fat 4.2 (2021-01-31)
 3月 09 21:37:56 raspberrypi4 systemd-fsck[345]: /dev/sda1: 289 files, 61052/516188 clusters
 3月 09 21:37:56 raspberrypi4 systemd[1]: Finished File System Check on /dev/disk/by-partuuid/91029070-01.
 3月 09 21:38:26 raspberrypi4 systemd[1]: systemd-fsckd.service: Succeeded.
 3月 09 21:38:26 raspberrypi4 systemd[1]: systemd-fsckd.service: Consumed 1.338s CPU time.
-- Boot 94c43597f9de4738860d5a408423591c --

一応/var/log/syslogから確認することも可能。

pi@raspberrypi4:~ $ grep -a "systemd-fsck*" /var/log/syslog
(中略)
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: e2fsck 1.46.2 (28-Feb-2021)
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: Pass 1: Checking inodes, blocks, and sizes
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: Pass 2: Checking directory structure
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: Pass 3: Checking directory connectivity
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: Pass 4: Checking reference counts
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: Pass 5: Checking group summary information
Mar  9 21:37:57 raspberrypi4 systemd-fsck[152]: rootfs: 111962/450560 files (0.1% non-contiguous), 1248929/1792000 blocks
Mar  9 21:37:57 raspberrypi4 systemd-fsck[345]: fsck.fat 4.2 (2021-01-31)
Mar  9 21:37:57 raspberrypi4 systemd-fsck[345]: /dev/sda1: 289 files, 61052/516188 clusters
Mar  9 21:38:26 raspberrypi4 systemd[1]: systemd-fsckd.service: Succeeded.
Mar  9 21:38:26 raspberrypi4 systemd[1]: systemd-fsckd.service: Consumed 1.338s CPU time.

fsckが実行されない通常起動時のログは以下。

pi@raspberrypi4:~ $ journalctl -u systemd-fsck*
(中略)
 3月 09 21:50:08 raspberrypi4 systemd-fsck[148]: e2fsck 1.46.2 (28-Feb-2021)
 3月 09 21:50:08 raspberrypi4 systemd-fsck[148]: rootfs: clean, 111964/450560 files, 1249005/1792000 blocks
-- Boot d69fb2cf1ae1445aa7b1876e30d275b0 --
 3月 09 21:50:08 raspberrypi4 systemd[1]: systemd-fsck@dev-disk-by\x2dpartuuid-91029070\x2d01.service: Succeeded.
 3月 09 21:50:08 raspberrypi4 systemd[1]: Stopped File System Check on /dev/disk/by-partuuid/91029070-01.
 3月 09 21:50:08 raspberrypi4 systemd[1]: systemd-fsck-root.service: Succeeded.
 3月 09 21:50:08 raspberrypi4 systemd[1]: Stopped File System Check on Root Device.
 3月 09 21:50:08 raspberrypi4 systemd[1]: systemd-fsck-root.service: Consumed 3.057s CPU time.
-- Boot 94c43597f9de4738860d5a408423591c --
 3月 09 21:50:10 raspberrypi4 systemd[1]: Starting File System Check on /dev/disk/by-partuuid/91029070-01...
 3月 09 21:50:10 raspberrypi4 systemd-fsck[339]: fsck.fat 4.2 (2021-01-31)
 3月 09 21:50:10 raspberrypi4 systemd-fsck[339]: /dev/sda1: 289 files, 61052/516188 clusters
 3月 09 21:50:10 raspberrypi4 systemd[1]: Finished File System Check on /dev/disk/by-partuuid/91029070-01.
 3月 09 21:50:40 raspberrypi4 systemd[1]: systemd-fsckd.service: Succeeded.
-- Boot 86674087b21d430184133809976e77d7 --
pi@raspberrypi4:~ $ grep -a "systemd-fsck*" /var/log/syslog
(中略)
Mar  9 21:50:07 raspberrypi4 systemd[1]: Requested transaction contradicts existing jobs: Transaction for wd_keepalive.service/start is destructive (systemd-fsck@dev-disk-by\x2dpartuuid-91029070\x2d01.service has 'stop' job queued, but 'start' is included in transaction).
Mar  9 21:50:07 raspberrypi4 systemd[1]: watchdog.service: Failed to enqueue OnFailure= job, ignoring: Transaction for wd_keepalive.service/start is destructive (systemd-fsck@dev-disk-by\x2dpartuuid-91029070\x2d01.service has 'stop' job queued, but 'start' is included in transaction).
Mar  9 21:50:11 raspberrypi4 systemd-fsck[148]: e2fsck 1.46.2 (28-Feb-2021)
Mar  9 21:50:11 raspberrypi4 systemd-fsck[148]: rootfs: clean, 111964/450560 files, 1249005/1792000 blocks
Mar  9 21:50:11 raspberrypi4 systemd-fsck[339]: fsck.fat 4.2 (2021-01-31)
Mar  9 21:50:11 raspberrypi4 systemd-fsck[339]: /dev/sda1: 289 files, 61052/516188 clusters
Mar  9 21:50:40 raspberrypi4 systemd[1]: systemd-fsckd.service: Succeeded.

※ USB-SSDからの起動環境なので、microSDからの起動と内容は少し異なるので注意

そうそう、systemd環境でsudo touch /fsck実行、再起動すると以下のログが出力されるんだよな。fsck.mode=forceを指定しなさいと。

 3月 08 20:58:48 raspberrypi4 systemd-fsck[141]: Please pass 'fsck.mode=force' on the kernel command line rather than creating /forcefsck on the root file system.

我が闘争@systemd

今となってはsystemdが主流になった感があり、Linux起動システムといえばsystemd、初めて触れたディストリビューションがそうだった、という人も多いかもしれない。
ぐぐるとsystemdを解説したページも多数ヒットする。Linux起動の仕組みを理解するにはまずsystemdという感じ。

しかし歴史的経緯として、initを置き換える目的でsystemdが導入されたのは約10年前で、当時かなり揉めたらしい。

Linus Torvalds and others on Linux's systemd

LinuxまたはUnixの開発者でない場合は、新しいLinux固有のシステムおよびサービスマネージャーであるsystemdについて聞いたことがありません。ただし、Linux開発者サークルでは、UnixとLinuxの従来のsysvinitデーモンのこの置き換え以外に、多くのプログラマーを怒らせるものはありません。

systemd - Wikipedia

systemdの設計はフリーソフトウェアコミュニティにおける重要な論争の元となった。これはsystemdのアーキテクチャはUNIX哲学に反しており最終的に相互依存でがんじがらめの塊を作ってしまうと批評家達を主張させるようになっているためである[7]。しかしながら2015年現在、主要なLinuxディストリビューションのほとんどはsystemdをデフォルトのinitシステムとして採用している。

Debiansystemdを採用したのは2015年4月25日、Debian8.0(jessie)から。そして、10年前と言えばRaspberry Piが発売された年。当時のRaspbianって何だっけ? と思い確認。
RaspbianFAQ

What is Raspbian?

Raspbian is an unofficial port of Debian wheezy armhf with compilation settings adjusted to produce code that uses "hardware floating point", the "hard float" ABI and will run on the Raspberry Pi.

このページ、懐かしいね。それはさておき、最初のRaspbianDebian wheezyベースだったということは、バーション番号で言えば7.0sysytemd対応直前、まだinitだったということになる。
ここら辺が混乱の元、変に(?)Linux歴が長い人や最初期からRaspberry Piに触れている人の中には今でもsudo touch /fsck方式が正と思い込んでいる人がいる、という状況なのかも。

参考URL:
Index of _pub_raspberrypi_raspbian_images
最古のRaspbianイメージ、wheezy版が確認できる。

Debian wheezy

実は手元に化石環境、Debian wheezyインストールデスクトップPC があり、丁度再最近sudo touch /fsckfsckをかけたので再確認したところ/var/log/fsck配下にログが確認できた。確かにこれはinitの挙動。

root@epiam10000:~# cat /var/log/fsck/checkfs
Log of fsck -C -R -A -a
Fri Mar 11 21:35:30 2022

fsck from util-linux 2.20.1
/dev/sda1: clean, 240/124496 files, 32433/248832 blocks

Fri Mar 11 21:35:30 2022
----------------
root@epiam10000:~# cat /var/log/fsck/checkroot
Log of fsck -C -a -t ext4 /dev/debian/root
Fri Mar 11 21:35:27 2022

fsck from util-linux 2.20.1
/dev/mapper/debian-root: clean, 157301/49987584 files, 180026135/199928832 blocks

Fri Mar 11 21:35:27 2022
----------------
root@epiam10000:~#

Devuan 4.0(Devuan Chimaera)

いずれにしても昔の話じゃん、という声もあるかもしれないが、今でもsystemdに移行していないディストリビューションはあるし、Debianにしてもその件で分裂してDevuanがフォークされている。
2015年4月7日 Debian 8が間もなくリリース,どう出る Devuan

DebianのバージョンアップはUbuntuなどDebianをペアレントとする多くのディストリビューションに影響を与えることになるが,そんな中でLinux界隈の一部ではDebianからフォークしたその名も「Devuan」のリリースに注目が集まっている。

Devuan(Dev-Oneと発音する)は,Jessieからはデフォルトの起動システムにsystemdを採用するとしたDebianの決定に反対したメンバーがDebianからフォークし,新たに立ち上げたプロジェクトだ。「⁠systemdの依存性の強さはディストリビューションとしての自由度を損ねる」としてDebian本体と決別,最初の安定版のリリースを目指して開発が行われている。

Welcome to devuan.org

Devuan GNU+Linux is a fork of Debian without systemd that allows users to reclaim control over their system by avoiding unnecessary entanglements and ensuring Init Freedom.
Devuan GNU + Linuxは、systemdを使用しないDebianのフォークであり、ユーザーが不要な絡み合いを回避し、Init Freedomを確保することで、システムの制御を取り戻すことができます。

どんだけsystemdが嫌なんだよというね(笑)。しかしDevuanは現在もDebian系の軽量ディストリビューションとして一定の評価は受けているという認識。
前から気になっていたので今回確認したところ、Debian Bullseye相当の最新版 4.0 がリリースされていてびっくり。

Release Information _ Devuan GNU+Linux Free Operating System

仮想PC用イメージも公開されていたので、VirtualBoxに入れてみた。

うーん、確かにこれはinitの挙動。起動も速いし軽量。しかし実際のところどうなんだろう。起動システムが違うだけでユーザランドはDebianと同じだろうし。ライトユーザには起動システムなんて関係ないような……。

我が闘争@Linux

systemdでの分裂で思い出したのがffmpeg。これも10年程前の話。

本の虫_ ffmpegとlibavの背景事情

2012-03-27

ffmpegとlibavの背景事情

ffmpegをインストールしようとしたら、なにやらちょうど一年前あたり、大規模なforkが起こったらしい。いまや、ffmpegとlibavに分裂している。forkは自由なソフトウェアではいたって普通の出来事だ。大抵の場合、開発者の間での意見の不一致により起こる自然な現象だ。自由なソフトウェアであれば、fork自体はそれほど悪いことではない。どちらも自由であるので、双方の開発者がIRCやMLで広角泡を飛ばしながら喧嘩しつつ、何事もなかったかのように相手のコードをこちらのコードベースにマージできる。なぜならば、どちらも自由なソフトウェアという共通点を持っているからだ。

GNOMEMonoで知られるミゲル君の投稿が話題になったのも10年前だったね。

何がLinuxデスクトップを殺したか(What Killed the Linux Desktop 日本語訳)

我々にもチャンスはあった。最大のチャンスは、Vista が市場でコケたときだ。なのに我々は内部闘争に明け暮れていた。その頃の自分たちがやっていた争いについて書いている人もいる。

Linux界隈っていつも揉めてるよな。これがフリーソフト、オープンソースという名の桃源郷の現実。といういか、民主主義の常か。
こうした古(いにしえ)のテキストを読み返していると思い出すのがOpenSSL is written by monkeys
今回再確認したらオリジナルは消滅していた。しかし大丈夫、githubに日本語翻訳版がアップされている。これが集合知の力ですよ(誤用)。

OpenSSL はサルが書いたに決まってる (OpenSSL is written by monkeys, by Marco Peereboom)

俺の結論はこうだ。OpenSSL はこれまで書かれてきた中でもダントツで 史上最悪のライブラリである。これはまさにサルが壁にウンコを投げつけているに等しい。 俺はいまだに全世界のインターネットがこのアホらしく複雑かつウンコな 「OpenSSLプロジェクト」とか呼ばれるコードの上で走っているのが信じられない。

10年近く前、OpenSSLの脆弱性ハートブリードが大問題になったけど、その数年前にOpenSSLの実装がいかに汚いか告発していた人が居たということで話題になったという経緯がある。
それにしても、今読み返しても普通に面白。Day 1Day 2ってのは英語での常套表現らしいけど、それが利いてるよな。ストーリー性があり味わいを増している。

因みに約20年程前、24 -TWENTY FOUR-というアメリカのTVドラマが大ヒットしたけど、ファンの間ではシーズンのことをDay1Day2なんて表現する、なんて話もあったね。
24 -TWENTY FOUR- - Wikipedia

アメリカのメディアやファンの間では、1つのストーリーが24時間で完結することから「シーズン(Season)」のことを「デイ(Day)」と表現する事がある(Day1、Day2……)。

Internet Archiveからオリジナルページを発掘。2020年頃に消滅した模様。
Flingpoo!

話が脱線しまくりだけど、前述の通り、丁度10年前がRaspberry Pi発売の年だった。10年前を振り返ってみるもアリでは。

余談

【 fsck 】コマンド――ファイルシステムを検査、修復する:Linux基本コマンドTips(191) - @IT

ファイルシステムに応じてそれぞれ/sbinなどにある専用のコマンドを呼び出しています。

公式ドキュメントにも関連項目として各ファイルシステムに対応したコマンドが挙げられている。

fsck(8) — manpages-ja — Debian bullseye — Debian Manpages

関連項目
fstab(5), mkfs(8), fsck.ext2(8) または fsck.ext3(8) または e2fsck(8), cramfsck(8), fsck.minix(8), fsck.msdos(8), fsck.jfs(8), fsck.nfs(8), fsck.vfat(8), fsck.xfs(8), fsck.xiafs(8), reiserfsck(8).

改めて眺めていて気になったのが二つ。
まず一つ目がfsck.nfsNFSの修復なんてできるの? とリンク先を確認。

fsck.nfs(8) — initscripts — Debian bullseye — Debian Manpages

名前

fsck.nfs-常に成功を返すダミーのfsck.nfsスクリプト。

説明

Debian GNU / Linuxは、ルートファイルシステムがNFS上にある場合にこれを必要とします。ルートがNFSマウントされているかどうかを確認する方法はなく、本当に「fsck-a/」を実行したいと考えています。

なるほどねぇ。
そして二つ目がfsck.minixMINIXのクローンとして出発したのがLinux。という歴史の1ページが垣間見えるね。

関連投稿:
ひねくれ者の Linux _ PC 談義 - Qiita

参考URL

Raspberry Pi4の不要なサービス・ハードの停止 _ WordPressをRaspberryPi4で始める方法
第545回 systemdのログ「ジャーナル」を見る・ためる:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
systemd_ジャーナル - ArchWiki
journalctlコマンド - systemd管理のログを見る - Ubuntuサーバー構築入門 - Ubuntuサーバーでゼロから環境構築
【初級者向け】Linuxシステムの起動 ~ SysVinit、Upstart、systemd ~ _ TECH PROjin
なぜsystemdなのか? _ POSTD
最低限知っておきたいsystemctlとjournalctlの使い方
systemd超入門 _ DevelopersIO
これからSystemd入門する - Qiita

4
2
0

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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?