「パフォーマンスの向上/ブートプロセス」の版間の差分
(同期) |
(同期) |
||
(4人の利用者による、間の16版が非表示) | |||
1行目: | 1行目: | ||
[[Category:ブートプロセス]] |
[[Category:ブートプロセス]] |
||
− | [[ar:Improve boot performance]] |
||
− | [[cs:Improve boot performance]] |
||
[[en:Improving performance/Boot process]] |
[[en:Improving performance/Boot process]] |
||
− | [[es: |
+ | [[es:Improving performance (Español)/Boot process]] |
− | [[ |
+ | [[fr:Improving performance (Français)/Boot process]] |
− | [[ |
+ | [[pt:Improving performance (Português)/Boot process]] |
− | [[ |
+ | [[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|[[ |
+ | {{Tip|[[UEFI]] でブートしていて、かつ systemd の [https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface Boot Loader Interface] を実装しているブートローダ (今のところ [[systemd-boot]] と [[GRUB]]) を使っている場合、''systemd-analyze'' は EFI ファームウェアとブートローダでかかった時間も追加で表示します。}} |
起動するのにかかった時間でユニットファイルを並べて一覧するには: |
起動するのにかかった時間でユニットファイルを並べて一覧するには: |
||
41行目: | 40行目: | ||
詳細は {{man|1|systemd-analyze}} を見て下さい。 |
詳細は {{man|1|systemd-analyze}} を見て下さい。 |
||
− | |||
− | === systemd-bootchart を使う === |
||
− | |||
− | 2012年10月に Bootchart は [[systemd]] にマージされ、オリジナルの bootchart と同じように使って起動できるようになりました。カーネルラインに以下を追加してください: |
||
− | |||
− | initcall_debug printk.time=y init=/usr/lib/systemd/systemd-bootchart |
||
− | |||
− | ある程度データが収集できたらログの記録が停止して保存された情報からグラフが生成されます。システムの起動シーケンスに問題がある場合、使用されているリソース (デフォルトでは I/O, CPU の使用率とカーネルの init スレッド) など、グラフの中に手がかりとなる情報があるはずです。基本的には systemd-analyze の plot 機能よりも詳しい情報を閲覧することができます。 |
||
− | |||
− | Bootchart のグラフはデフォルトでは {{ic|/run/log}} に書き込まれ {{ic|1=MESSAGE_ID=9f26aa562cf440c2b16c773d0479b518}} でジャーナルに保存されます。Journal の {{ic|1=BOOTCHART=}} フィールドには SVG 形式のブートチャートを指定します。 |
||
− | |||
− | 詳しくは [http://www.freedesktop.org/software/systemd/man/systemd-bootchart.html man ページ] を見てください。 |
||
=== 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 のドキュメント] を読んで下さい。 |
||
== カスタムカーネルをコンパイルする == |
== カスタムカーネルをコンパイルする == |
||
74行目: | 59行目: | ||
[[#カスタムカーネルをコンパイルする|カスタムカーネルのコンパイル]]と同じように、initramfs もダイエットさせることができます。[[mkinitcpio]] の {{ic|autodetect}} フックを使うのが一番簡単です。詳しくは [[initramfs の最小化]]を見てください。 |
[[#カスタムカーネルをコンパイルする|カスタムカーネルのコンパイル]]と同じように、initramfs もダイエットさせることができます。[[mkinitcpio]] の {{ic|autodetect}} フックを使うのが一番簡単です。詳しくは [[initramfs の最小化]]を見てください。 |
||
+ | ハードウェア (プロセッサとストレージの速度) にもよりますが、デフォルトの {{Pkg|zstd}} 圧縮オプションの代わりに {{Pkg|lz4}} を使うと、起動時の解凍速度が速くなり、ディスクから読み込む initramfs のサイズが若干大きくなりますが、通常相殺されるため速くなることがあります。[[mkinitcpio#COMPRESSION]] を見て下さい。 |
||
− | == サービスを早めに起動する == |
||
+ | == サービスの適切な起動方法を選択する == |
||
− | systemd の中心的な機能は [[D-Bus]] とソケットアクティベーションです。ソケットアクティベーションが使われている場合、最初にサービスにアクセスした時にサービスが起動します。大抵はそれで問題ありません。しかしながら、ブート中に必ず起動する ([[UPower]] のような) サービスがあるのであれば、そのサービスを出来る限り早めに起動することで起動時間を短縮できます。以下のようなコマンドを実行してサービスを有効化してください: |
||
+ | systemd の中心的な機能のひとつに [[D-Bus]] とソケットのアクティベーションがあります。この機能はほとんどの場合、サービスが最初にアクセスされたときにだけ起動され、一般的に良いことなので好まれるはずです(例えば、起動時に {{ic|cups.service}} を有効にすることは通常デスクトップでは有用ではありません、なぜなら {{ic|cups.socket}} だけ有効にすると、実際に印刷するときだけサービスを起動することになるからです。) |
||
− | # systemctl enable upower |
||
+ | しかし、あるサービス ({{Pkg|upower}} など) が起動時に常に開始されることがわかっている場合、できるだけ早く開始することで全体の起動時間を短縮できる可能性があります。これは(サービスファイルがそのように設定されている場合、ほとんどの場合)、{{ic|upower.service}} を [[有効化]] することで実現できます。 |
||
− | 上記のコマンドによって systemd は UPower を出来る限り早く起動するようになり、ソケットや D-Bus による有効化は使われなくなります。 |
||
+ | |||
+ | これにより、systemd はソケットや D-Bus のアクティベーションで競合することなく、できるだけ早く UPower を起動します。 |
||
==スタッガード・スピンアップ== |
==スタッガード・スピンアップ== |
||
90行目: | 77行目: | ||
使われていない場合は、起動時に何も出力されないはずです。 |
使われていない場合は、起動時に何も出力されないはずです。 |
||
− | 無効にするには、[[カーネルパラメータ |
+ | 無効にするには、[[カーネルパラメータ]]に {{ic|1=libahci.ignore_sss=1}} を追加してください。 |
− | ==ファイルシステムのマウント== |
+ | == ファイルシステムのマウント == |
− | [[mkinitcpio]] の {{ic|fsck}} フックによって、 |
+ | [[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 |
+ | [[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 |
+ | また、{{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}}。 |
}} |
}} |
||
== 起動中の出力を減らす == |
== 起動中の出力を減らす == |
||
− | システムによっては (特に [[SSD]] を使っている場合)、 |
+ | システムによっては (特に [[SSD]] を使っている場合)、TTY のパフォーマンスが遅いことがボトルネックになっている場合があり、出力を減らすことで起動が速くなることがあります。[[サイレントブート]]の記事を見てください。 |
+ | |||
+ | == ブートローダーの変更 == |
||
+ | |||
+ | [[ブートローダー]]を (例: [[systemd-boot]] などのよりシンプルなブートローダーに) 変更することで、起動時間を秒単位で減らせるかもしれません。 |
||
+ | |||
+ | あなたのセットアップで可能なのであれば、[[EFISTUB]] だけを使えば更に起動時間を短縮できます。 |
||
== RAM にサスペンド == |
== RAM にサスペンド == |
||
− | 起動時間を短縮する一番よい方法は起動しないことです。[[サスペンドとハイバネート|サスペンド]]を使用することを |
+ | 起動時間を短縮する一番よい方法は起動しないことです。[[サスペンドとハイバネート|サスペンド]]を使用することを検討してください。 |
+ | |||
+ | {{TranslationStatus|Improving performance/Boot process|2023-05-30|779863}} |
2023年5月30日 (火) 06:15時点における最新版
関連記事
システムのブートパフォーマンスを向上させることで、起動待機時間を短縮し、特定のシステムファイルとスクリプトが相互にどう作用しているのかをより良く知ることができます。この記事では Arch Linux システムのブートパフォーマンスを向上させる方法を集めています。
目次
ブートプロセスを解析する
systemd-analyze を使う
systemd は systemd-analyze
という名前のツールを提供しており、これを使えばブートプロセスにかかっている時間の詳細を表示することができます。また、svg のグラフを出力してユニットの依存関係を把握することができます。どのユニットファイルが起動時間を遅くしているのかが一目でわかり、それに応じてシステムを最適化することが可能です。
起動時、カーネルスペースとユーザースペースでどれくらい時間がかかっているか見たい場合、以下のコマンドを実行してください:
$ systemd-analyze
起動するのにかかった時間でユニットファイルを並べて一覧するには:
$ systemd-analyze blame
特定のユニットがきちんと動かないために全体の起動時間が長くなっている場合があります。起動チェインの中でどのユニットが起動を遅くしているのか確認するには、次を実行してください:
$ systemd-analyze critical-chain
Bootchart のように、ブートプロセスを視覚的に表す SVG ファイルを生成することもできます:
$ systemd-analyze plot > plot.svg
詳細は systemd-analyze(1) を見て下さい。
bootchart2 を使う
Bootchart2 を使うことでも、ブートシーケンスを視覚化することができます。
起動時に busybox の代わりに systemd を使用する
デフォルトでは、Mkinitcpio の設定は initramfs の構築に base
と udev
フックを使用します。これらを systemd
に置き換えることで、より高速なブートタイムを実現することができます。
詳しくは mkinitcpio#通常のフック を見て下さい。fsck
フックを置き換える場合は Fsck#ブート時のチェック も見て下さい。
カスタムカーネルをコンパイルする
カスタムカーネルをコンパイルすれば起動時間やメモリの使用量を減らすことができます。ただし最近は64ビットのアーキテクチャが一般的になっており、Linux カーネルはモジュール設計を取っているため、期待していたよりも効果がないかもしれません。詳しくはカーネル#コンパイルを見てください。
Initramfs
カスタムカーネルのコンパイルと同じように、initramfs もダイエットさせることができます。mkinitcpio の autodetect
フックを使うのが一番簡単です。詳しくは 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
を追加してください。
ファイルシステムのマウント
mkinitcpio の fsck
フックによって、カーネルラインの ro
を rw
に変更することで、時間のかかる root パーティションの再マウントを避けることができます。マウントオプションはカーネルラインで rootflags=rw,他のマウントオプション
と指定することで設定できます。/etc/fstab
からルートパーティションのエントリは必ず削除してください、そうしないと systemd-remount-fs.service
が fstab の設定を適用し続けます。もしくは、ユニットをマスクしてもよいです。
btrfs を root ファイルシステムで使っている場合、他のファイルシステムのように起動毎に毎回 fsck をする必要はありません。この場合、mkinitcpio の fsck
フックは削除してかまいません。systemd-fsck-root.service
をマスクしたり、カーネルコマンドラインで fsck.mode=skip
を使うことで root ファイルシステムの fsck をしないようにできます。mkinitcpio の fsck
フックがなくても、systemd は systemd-fsck@.service
を使って適切なファイルシステムを全て fsck します。
また、/etc/fstab
から API ファイルシステムを削除することもできます。systemd 自身がそれらをマウントするからです (pacman -Ql systemd | grep '\.mount$'
でそのリストを見れます)。sysvinit から /tmp
エントリを持ち越しているユーザーには聞き慣れないかもしれませんが、上のコマンドによって systemd がそれらを管理していることに気づくはずです。従って、エントリは削除しても問題ありません。
/home
や EFI システムパーティション などの他のファイルシステムはカスタムマウントユニットでマウントできます。マウントオプションに noauto,x-systemd.automount
を追加するとパーティションへの全てのアクセスをバッファし、最初にアクセスしたときに fsck とマウントを行うようになり、ブートプロセスで fsck とマウントをするファイルシステムの数を減らせます。
起動中の出力を減らす
システムによっては (特に SSD を使っている場合)、TTY のパフォーマンスが遅いことがボトルネックになっている場合があり、出力を減らすことで起動が速くなることがあります。サイレントブートの記事を見てください。
ブートローダーの変更
ブートローダーを (例: systemd-boot などのよりシンプルなブートローダーに) 変更することで、起動時間を秒単位で減らせるかもしれません。
あなたのセットアップで可能なのであれば、EFISTUB だけを使えば更に起動時間を短縮できます。
RAM にサスペンド
起動時間を短縮する一番よい方法は起動しないことです。サスペンドを使用することを検討してください。