「パフォーマンスの向上/ブートプロセス」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎サービスを早めに起動する: 項目と内容を英語版と同期)
(同期)
 
(2人の利用者による、間の12版が非表示)
1行目: 1行目:
 
[[Category:ブートプロセス]]
 
[[Category:ブートプロセス]]
[[ar:Improve boot performance]]
 
[[cs:Improve boot performance]]
 
 
[[en:Improving performance/Boot process]]
 
[[en:Improving performance/Boot process]]
[[es:Improve boot performance]]
+
[[es:Improving performance (Español)/Boot process]]
[[it:Improve boot performance]]
+
[[fr:Improving performance (Français)/Boot process]]
[[ru:Improving performance/Boot process]]
+
[[pt:Improving performance (Português)/Boot process]]
[[zh-hans:Improve boot performance]]
+
[[ru:Improving performance (Русский)/Boot process]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related|パフォーマンスの最大化}}
+
{{Related|パフォーマンスの向上}}
 
{{Related|サイレントブート}}
 
{{Related|サイレントブート}}
 
{{Related|デーモン}}
 
{{Related|デーモン}}
14行目: 12行目:
 
{{Related|Kexec}}
 
{{Related|Kexec}}
 
{{Related articles end}}
 
{{Related articles end}}
  +
システムのブートパフォーマンスを向上させることは起動待機時間の短縮とシステムファイル・スクリプトが相互にどう作用しているのか知る方法を提供します。この記事では Arch Linux の起動時間を改善する方法を集めています。
 
  +
システムのブートパフォーマンスを向上させることで、起動待機時間を短縮し、特定のシステムファイルとスクリプトが相互にどう作用しているのかをより良く知ることができます。この記事では Arch Linux システムのブートパフォーマンスを向上させる方法を集めています。
   
 
== ブートプロセスを解析する ==
 
== ブートプロセスを解析する ==
26行目: 25行目:
 
$ systemd-analyze
 
$ systemd-analyze
   
{{Tip|[[Unified Extensible Firmware Interface|UEFI]] でブートしていて、かつ systemd の [https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface Boot Loader Interface] を実装しているブートローダ (今のところ [[systemd-boot]] と [[GRUB]] のみ) を使っている場合、''systemd-analyze'' は EFI ファームウェアとブートローダでかかった時間も追加で表示します。}}
+
{{Tip|[[UEFI]] でブートしていて、かつ systemd の [https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface Boot Loader Interface] を実装しているブートローダ (今のところ [[systemd-boot]] と [[GRUB]]) を使っている場合、''systemd-analyze'' は EFI ファームウェアとブートローダでかかった時間も追加で表示します。}}
   
 
起動するのにかかった時間でユニットファイルを並べて一覧するには:
 
起動するのにかかった時間でユニットファイルを並べて一覧するには:
44行目: 43行目:
 
=== bootchart2 を使う ===
 
=== bootchart2 を使う ===
   
  +
[[Bootchart#Bootchart2|Bootchart2]] を使うことでも、ブートシーケンスを視覚化することができます。
ブートシーケンスを視覚化するバージョンの bootchart を使うこともできます。セカンド init をカーネルコマンドラインに加えることができないので、標準の bootchart セットアップはできません。しかし、[[Arch User Repository|AUR]] の {{AUR|bootchart2-git}} パッケージにはドキュメント化されてない [[systemd]] サービスが付いています。bootchart2 をインストールした後に次を実行してください:
 
   
  +
== 起動時に busybox の代わりに systemd を使用する ==
# systemctl enable bootchart2
 
   
  +
デフォルトでは、[[Mkinitcpio]] の設定は initramfs の構築に {{ic|base}} と {{ic|udev}} フックを使用します。これらを {{ic|systemd}} に置き換えることで、より高速なブートタイムを実現することができます。
{{ic|/var/log/bootchart.png}} を開くことで結果を視覚的に確認できます。もしくは以下のコマンドを実行してみてください:
 
   
  +
詳しくは [[mkinitcpio#通常のフック]] を見て下さい。{{ic|fsck}} フックを置き換える場合は [[Fsck#ブート時のチェック]] も見て下さい。
$ pybootchartgui -i
 
 
bootchart の使い方など詳しい説明は [https://github.com/mmeeks/bootchart bootchart2 のドキュメント] を読んで下さい。
 
   
 
== カスタムカーネルをコンパイルする ==
 
== カスタムカーネルをコンパイルする ==
61行目: 58行目:
   
 
[[#カスタムカーネルをコンパイルする|カスタムカーネルのコンパイル]]と同じように、initramfs もダイエットさせることができます。[[mkinitcpio]] の {{ic|autodetect}} フックを使うのが一番簡単です。詳しくは [[initramfs の最小化]]を見てください。
 
[[#カスタムカーネルをコンパイルする|カスタムカーネルのコンパイル]]と同じように、initramfs もダイエットさせることができます。[[mkinitcpio]] の {{ic|autodetect}} フックを使うのが一番簡単です。詳しくは [[initramfs の最小化]]を見てください。
  +
  +
ハードウェア (プロセッサとストレージの速度) にもよりますが、デフォルトの {{Pkg|zstd}} 圧縮オプションの代わりに {{Pkg|lz4}} を使うと、起動時の解凍速度が速くなり、ディスクから読み込む initramfs のサイズが若干大きくなりますが、通常相殺されるため速くなることがあります。[[mkinitcpio#COMPRESSION]] を見て下さい。
   
 
== サービスの適切な起動方法を選択する ==
 
== サービスの適切な起動方法を選択する ==
78行目: 77行目:
 
使われていない場合は、起動時に何も出力されないはずです。
 
使われていない場合は、起動時に何も出力されないはずです。
   
無効にするには、[[カーネルパラメータ|kernel 行]]に {{ic|1=libahci.ignore_sss=1}} を追加してください。
+
無効にするには、[[カーネルパラメータ]]に {{ic|1=libahci.ignore_sss=1}} を追加してください。
   
==ファイルシステムのマウント==
+
== ファイルシステムのマウント ==
   
[[mkinitcpio]] の {{ic|fsck}} フックによって、時間のかかる root パティショの再マウントを避けることができます。kernel 行の {{ic|ro}} を {{ic|rw}} に変更して {{ic|/etc/fstab}} からパーティションを削除してください。マウントオプションは kernel 行で {{ic|1=rootflags=mount options...}} と指定することで設定できます。{{ic|/etc/fstab}} からエントリは必ず削除してください、そうしないと {{ic|systemd-remount-fs.service}} が [[fstab]] の設定を適用し続けます。もしくは、ユニットをマスクすることで設定きます。
+
[[mkinitcpio]] の {{ic|fsck}} フックによって、ネルラインの {{ic|ro}} を {{ic|rw}} に変更することで、時間のかかる root パーティションの再マウント避けることができます。マウントオプションはカーネルラインで {{ic|1=rootflags='''rw''',''他のマウントオプション''}} と指定することで設定できます。{{ic|/etc/fstab}} からルートパーティションのエントリは必ず削除してください、そうしないと {{ic|systemd-remount-fs.service}} が [[fstab]] の設定を適用し続けます。もしくは、ユニットをマスクしてよいです。
   
btrfs を root ファイルシステムで使っている場合、他のファイルシステムのように起動毎に毎回 fsck をする必要はありません。この場合、[[mkinitcpio]] の {{ic|fsck}} フックは削除してかまいません。{{ic|systemd-fsck-root.service}} をマスクしたり、カーネルコマンドラインで {{ic|fsck.mode=skip}} を使うことで root ファイルシステムの fsck をしないようにできます。[[mkinitcpio]] の {{ic|fsck}} フックがなくても、systemd は {{ic|systemd-fsck@.service}} を使って適切なファイルシステムを全て fsck します。
+
[[btrfs]] を root ファイルシステムで使っている場合、他のファイルシステムのように起動毎に毎回 fsck をする必要はありません。この場合、[[mkinitcpio]] の {{ic|fsck}} フックは削除してかまいません。{{ic|systemd-fsck-root.service}} をマスクしたり、カーネルコマンドラインで {{ic|1=fsck.mode=skip}} を使うことで root ファイルシステムの fsck をしないようにできます。[[mkinitcpio]] の {{ic|fsck}} フックがなくても、systemd は {{ic|systemd-fsck@.service}} を使って適切なファイルシステムを全て fsck します。
   
また、{{ic|/etc/fstab}} から API ファイルシステムを削除することもできます。systemd 自身がそれらをマウントするからです ({{ic|pacman -Ql systemd <nowiki>|</nowiki> grep '\.mount$'}} でそのリストを見れます)。sysvinit から /tmp エントリを持ち越しているユーザーには聞き慣れないかもしれませんが、上のコマンドによって systemd がそれらを管理していることに気づくはずです。従って、エントリは削除しても問題ありません。
+
また、{{ic|/etc/fstab}} から API ファイルシステムを削除することもできます。systemd 自身がそれらをマウントするからです ({{ic|pacman -Ql systemd {{!}} grep '\.mount$'}} でそのリストを見れます)。sysvinit から {{ic|/tmp}} エントリを持ち越しているユーザーには聞き慣れないかもしれませんが、上のコマンドによって systemd がそれらを管理していることに気づくはずです。従って、エントリは削除しても問題ありません。
   
{{ic|/home}} などの他のファイルシステムはカスタムマウントユニットでマウントできます。マウントオプションに {{ic|noauto,x-systemd.automount}} を追加するとパーティションへの全てのアクセスをバッファし、最初にアクセスしたときに fsck とマウントを行うようになり、ブートプロセスで fsck とマウントをするファイルシステムの数を減らせます。
+
{{ic|/home}} や [[EFI システムパーティション]] などの他のファイルシステムはカスタムマウントユニットでマウントできます。マウントオプションに {{ic|noauto,x-systemd.automount}} を追加するとパーティションへの全てのアクセスをバッファし、最初にアクセスしたときに fsck とマウントを行うようになり、ブートプロセスで fsck とマウントをするファイルシステムの数を減らせます。
   
 
{{Note|
 
{{Note|
 
* 上記の設定を使うと {{ic|/home}} ファイルシステムが {{ic|autofs}} タイプになり、デフォルトで [[mlocate]] によって無視されるようになります。システムによっては {{ic|/home}} の自動化による高速化は数秒の効果しかない場合もあります。
 
* 上記の設定を使うと {{ic|/home}} ファイルシステムが {{ic|autofs}} タイプになり、デフォルトで [[mlocate]] によって無視されるようになります。システムによっては {{ic|/home}} の自動化による高速化は数秒の効果しかない場合もあります。
* [[Btrfs]] サブボリュームにシステムをインストールしていて (ルートディレクトリ {{ic|/}} 自体がサブボリュームの場合)、{{ic|/home}} を分割して使っている場合、{{ic|/home}} サブボリュームの作成をしないように設定したほうが良いでしょう。{{ic|home.conf}} の tmpfile をマスクしてください: {{ic|ln -s /dev/null /etc/tmpfiles.d/home.conf}}。
+
* ''btrfs'' サブボリュームにシステムをインストールしていて (ルートディレクトリ {{ic|/}} 自体がサブボリュームの場合)、{{ic|/home}} を分割して使っている場合、{{ic|/home}} サブボリュームの作成をしないように設定したほうが良いでしょう。{{ic|home.conf}} の tmpfile をマスクしてください: {{ic|ln -s /dev/null /etc/tmpfiles.d/home.conf}}。
 
}}
 
}}
   
 
== 起動中の出力を減らす ==
 
== 起動中の出力を減らす ==
   
システムによっては (特に [[SSD]] を使っている場合)、[[getty|tty]] のパフォーマンスが遅いことがボトルネックになっている場合があり、出力を減らすことで起動が速くなることがあります。[[サイレントブート]]を見てください。
+
システムによっては (特に [[SSD]] を使っている場合)、TTY のパフォーマンスが遅いことがボトルネックになっている場合があり、出力を減らすことで起動が速くなることがあります。[[サイレントブート]]の記事を見てください。
   
 
== ブートローダーの変更 ==
 
== ブートローダーの変更 ==
   
  +
[[ブートローダー]]を (例: [[systemd-boot]] などのよりシンプルなブートローダーに) 変更することで、起動時間を秒単位で減らせるかもしれません。
もし、設定が可能であれば、[[Arch ブートプロセス#機能比較|ブートローダー]] を変更したり、[[EFISTUB]] で何も使わないようにしてみてください。
 
  +
  +
あなたのセットアップで可能なのであれば、[[EFISTUB]] だけを使えば更に起動時間を短縮できます。
   
 
== RAM にサスペンド ==
 
== RAM にサスペンド ==
   
起動時間を短縮する一番よい方法は起動しないことです。[[サスペンドとハイバネート|サスペンド]]を使用することを考慮してください。
+
起動時間を短縮する一番よい方法は起動しないことです。[[サスペンドとハイバネート|サスペンド]]を使用することを検討してください。
  +
  +
{{TranslationStatus|Improving performance/Boot process|2023-05-30|779863}}

2023年5月30日 (火) 06:15時点における最新版

関連記事

システムのブートパフォーマンスを向上させることで、起動待機時間を短縮し、特定のシステムファイルとスクリプトが相互にどう作用しているのかをより良く知ることができます。この記事では Arch Linux システムのブートパフォーマンスを向上させる方法を集めています。

ブートプロセスを解析する

systemd-analyze を使う

systemdsystemd-analyze という名前のツールを提供しており、これを使えばブートプロセスにかかっている時間の詳細を表示することができます。また、svg のグラフを出力してユニットの依存関係を把握することができます。どのユニットファイルが起動時間を遅くしているのかが一目でわかり、それに応じてシステムを最適化することが可能です。

起動時、カーネルスペースとユーザースペースでどれくらい時間がかかっているか見たい場合、以下のコマンドを実行してください:

$ systemd-analyze
ヒント: UEFI でブートしていて、かつ systemd の Boot Loader Interface を実装しているブートローダ (今のところ systemd-bootGRUB) を使っている場合、systemd-analyze は EFI ファームウェアとブートローダでかかった時間も追加で表示します。

起動するのにかかった時間でユニットファイルを並べて一覧するには:

$ systemd-analyze blame

特定のユニットがきちんと動かないために全体の起動時間が長くなっている場合があります。起動チェインの中でどのユニットが起動を遅くしているのか確認するには、次を実行してください:

$ systemd-analyze critical-chain

Bootchart のように、ブートプロセスを視覚的に表す SVG ファイルを生成することもできます:

$ systemd-analyze plot > plot.svg

詳細は systemd-analyze(1) を見て下さい。

bootchart2 を使う

Bootchart2 を使うことでも、ブートシーケンスを視覚化することができます。

起動時に busybox の代わりに systemd を使用する

デフォルトでは、Mkinitcpio の設定は initramfs の構築に baseudev フックを使用します。これらを systemd に置き換えることで、より高速なブートタイムを実現することができます。

詳しくは mkinitcpio#通常のフック を見て下さい。fsck フックを置き換える場合は Fsck#ブート時のチェック も見て下さい。

カスタムカーネルをコンパイルする

カスタムカーネルをコンパイルすれば起動時間やメモリの使用量を減らすことができます。ただし最近は64ビットのアーキテクチャが一般的になっており、Linux カーネルはモジュール設計を取っているため、期待していたよりも効果がないかもしれません。詳しくはカーネル#コンパイルを見てください。

Initramfs

カスタムカーネルのコンパイルと同じように、initramfs もダイエットさせることができます。mkinitcpioautodetect フックを使うのが一番簡単です。詳しくは initramfs の最小化を見てください。

ハードウェア (プロセッサとストレージの速度) にもよりますが、デフォルトの zstd 圧縮オプションの代わりに lz4 を使うと、起動時の解凍速度が速くなり、ディスクから読み込む initramfs のサイズが若干大きくなりますが、通常相殺されるため速くなることがあります。mkinitcpio#COMPRESSION を見て下さい。

サービスの適切な起動方法を選択する

systemd の中心的な機能のひとつに D-Bus とソケットのアクティベーションがあります。この機能はほとんどの場合、サービスが最初にアクセスされたときにだけ起動され、一般的に良いことなので好まれるはずです(例えば、起動時に cups.service を有効にすることは通常デスクトップでは有用ではありません、なぜなら cups.socket だけ有効にすると、実際に印刷するときだけサービスを起動することになるからです。)

しかし、あるサービス (upower など) が起動時に常に開始されることがわかっている場合、できるだけ早く開始することで全体の起動時間を短縮できる可能性があります。これは(サービスファイルがそのように設定されている場合、ほとんどの場合)、upower.service有効化 することで実現できます。

これにより、systemd はソケットや D-Bus のアクティベーションで競合することなく、できるだけ早く UPower を起動します。

スタッガード・スピンアップ

一部のハードウェアにはスタッガード・スピンアップ (Staggered spin-up, SSS) が実装されています。SSS が実装されている HDD の場合、OS は ATA インターフェースを連続的に調べるようになり、段階を追ってドライブをスピンアップすることができるため最大電気使用量が減少します。ただしスタッガード・スピンアップは起動時間を遅くし、ほとんどのコンシューマ機では電源を入れたときに瞬時にドライブがスピンアップするので全く利益がありません。SSS が使われているかどうか確認するには:

$ dmesg | grep SSS

使われていない場合は、起動時に何も出力されないはずです。

無効にするには、カーネルパラメータlibahci.ignore_sss=1 を追加してください。

ファイルシステムのマウント

mkinitcpiofsck フックによって、カーネルラインの rorw に変更することで、時間のかかる root パーティションの再マウントを避けることができます。マウントオプションはカーネルラインで rootflags=rw,他のマウントオプション と指定することで設定できます。/etc/fstab からルートパーティションのエントリは必ず削除してください、そうしないと systemd-remount-fs.servicefstab の設定を適用し続けます。もしくは、ユニットをマスクしてもよいです。

btrfs を root ファイルシステムで使っている場合、他のファイルシステムのように起動毎に毎回 fsck をする必要はありません。この場合、mkinitcpiofsck フックは削除してかまいません。systemd-fsck-root.service をマスクしたり、カーネルコマンドラインで fsck.mode=skip を使うことで root ファイルシステムの fsck をしないようにできます。mkinitcpiofsck フックがなくても、systemd は systemd-fsck@.service を使って適切なファイルシステムを全て fsck します。

また、/etc/fstab から API ファイルシステムを削除することもできます。systemd 自身がそれらをマウントするからです (pacman -Ql systemd | grep '\.mount$' でそのリストを見れます)。sysvinit から /tmp エントリを持ち越しているユーザーには聞き慣れないかもしれませんが、上のコマンドによって systemd がそれらを管理していることに気づくはずです。従って、エントリは削除しても問題ありません。

/homeEFI システムパーティション などの他のファイルシステムはカスタムマウントユニットでマウントできます。マウントオプションに noauto,x-systemd.automount を追加するとパーティションへの全てのアクセスをバッファし、最初にアクセスしたときに fsck とマウントを行うようになり、ブートプロセスで fsck とマウントをするファイルシステムの数を減らせます。

ノート:
  • 上記の設定を使うと /home ファイルシステムが autofs タイプになり、デフォルトで mlocate によって無視されるようになります。システムによっては /home の自動化による高速化は数秒の効果しかない場合もあります。
  • btrfs サブボリュームにシステムをインストールしていて (ルートディレクトリ / 自体がサブボリュームの場合)、/home を分割して使っている場合、/home サブボリュームの作成をしないように設定したほうが良いでしょう。home.conf の tmpfile をマスクしてください: ln -s /dev/null /etc/tmpfiles.d/home.conf

起動中の出力を減らす

システムによっては (特に SSD を使っている場合)、TTY のパフォーマンスが遅いことがボトルネックになっている場合があり、出力を減らすことで起動が速くなることがあります。サイレントブートの記事を見てください。

ブートローダーの変更

ブートローダーを (例: systemd-boot などのよりシンプルなブートローダーに) 変更することで、起動時間を秒単位で減らせるかもしれません。

あなたのセットアップで可能なのであれば、EFISTUB だけを使えば更に起動時間を短縮できます。

RAM にサスペンド

起動時間を短縮する一番よい方法は起動しないことです。サスペンドを使用することを検討してください。

翻訳ステータス: このページは en:Improving performance/Boot process の翻訳バージョンです。最後の翻訳日は 2023-05-30 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。