システムの起動プロセスを理解することは、システム管理者および運用と保守にとって非常に重要です。システムに障害が発生した場合の効果的なトラブルシューティングには、システムの起動方法を理解することが非常に重要です。システムが起動し、数分後、ログインプロンプトの段階に到達したことがわかります。起動シーケンスのすべての段階が正常に経過したこと、およびシステムの起動中にこれらの舞台裏で何が起こったかを調べようとしていますか? Centos6システムの起動プロセスについて理解しましょう。
全体的なプロセスはおおまかに次のとおりです。
システムの電源がオンになると、マザーボードBIOS(基本入力/出力システム)がPOST(パワーオンセルフテスト)コードを実行して、システムの主要な周辺デバイス(CPU、メモリ、グラフィックカード、I / O、キーボード、マウスなど)を検出します。ハードウェア構成情報と一部のユーザー構成パラメーターは、マザーボードのCMOS(Complementary Metal Oxide Semiconductor)(通常は64バイト)に保存されます。これは、実際には、マザーボード上の読み取りおよび書き込み可能なRAMチップであり、マザーボード上のバッテリーから電力が供給され、システムの電源がオフになります。その後、情報が失われることはありません。
POSTコードを実行してシステムの主要な周辺機器を検出した後、システムはセルフチェックプログラムを開始し、BIOSで設定されたブートシーケンスに従ってブートドライブ(ハードディスク、CD-ROM、ネットワークサーバーなど)を検索します。通常の状況では、ハードディスクデバイスなどの適切なイニシエーターを選択します。BIOSは、ハードディスクデバイスの最初のセクター(MBR、512バイト)を読み取り、その中のコードを実行します。実際、ここでのBIOSは、ブートデバイスの最初のセクターに何があるかを気にせず、セクターのコンテンツの読み取りと実行のみを担当し、BIOSのタスクが完了します。その後、システム起動の制御がMBR部分のコードに移ります。
BIOS
MBR:
MBRのサイズは512バイトで、HDDの最初または最後のセクターにあります(メーカーによって異なります)。
メインブートローダーコード(446バイト):このコードは、ブートローダー情報と、ハードディスク上の実際のブートローダーコードの場所の詳細を提供します。これは、CPUがブートローダーの第2ステージをロードするのに役立ちます。
パーティションテーブル情報(64バイト):MBRには64バイトのデータが含まれ、各パーティションの開始と終了、パーティションサイズ、パーティションタイプ(プライマリパーティションか拡張パーティションかなど)などのパーティションテーブル情報を格納するために使用されます。
Magic Number(2Bytes):MBRの検証チェックとして。
Bootloader:
異なるオペレーティングシステムのファイルシステムフォーマットが異なることを私たちは知っていますか?また、1つのディスクで複数のオペレーティングシステムをインストールできることもわかっています。「ブートローダー」で目的のオペレーティングシステムを実現するにはどうすればよいでしょうか。 446バイトのブートローダーは、非常に多くの異なる機能には十分ではありません。したがって、対応するオペレーティングシステムのコアファイルを処理するために、対応するプログラムを作成する必要があります。このプログラムは、オペレーティングシステムのローダーです(MBRのブートローダーではないことに注意してください)。このように、 bootloader
は対応する操作に制御を転送するだけで済みます。システムのローダーは、オペレーティングシステムの起動を担当します。
次の図は、 Bootloader
の役割をよりよく説明できます。
上の図の内容を解釈すると、ハードディスクの各パーティションの最初のセクターは「ブートセクター」と呼ばれ、このセクターにはオペレーティングシステムのローダーが格納されていることがわかります。したがって、上の図に示すように、パーティションにインストールできるオペレーティングシステムは1つだけであるとよく言われます。 、最初のパーティションの「ブートセクター」はWindowsローダーを格納し、2番目のパーティションはLinuxローダーを格納し、3番目と4番目はオペレーティングシステムがインストールされていないため空です。 MBRの bootloader
が行うことに関して、 bootloader
には3つの機能があります:メニューを提供し、カーネルファイルを読み取り、それらを他のローダーに転送します。
メニューを提供することは、ユーザーが入力するオペレーティングシステムを選択できるようにするメニューをユーザーに提供することです。
カーネルファイルを読み取ると、システムにはデフォルトで起動するオペレーティングシステムがあることがわかります。このオペレーティングシステムのローダーには、それが配置されているパーティションのブートセクターにコピーがあります。さらに、デフォルトで起動するオペレーティングシステムのローダーのコピーもコピーされます。 MBRのブートローダーでは、MBRはブートローダーのローダーを直接読み取り、デフォルトのオペレーティングシステムを起動します。
別のローダーに転送するユーザーが起動する他のオペレーティングシステムを選択すると、ブートローダーは制御を対応するローダーに転送し、オペレーティングシステムの起動を担当させます。
MBRは16バイトを使用して単一のパーティション情報を格納します。そのため、MBRコンセプトのパーティション数は4に制限されています(4×16 = 64)。
64 各バイトには、4つのパーティション(16x4)のパーティション情報が含まれています。 MBRは4つのパーティションの情報しか保存できないため、ハードディスクは4つのプライマリパーティションしか持つことができないのはこのためです。したがって、ハードディスクに4つを超えるパーティションが必要な場合は、プライマリパーティションの1つを拡張し、これらの拡張パーティションの外部に論理パーティションを作成する必要があります。
また、GRUB(または古いシステムではLILO)に関する情報も含まれているため、簡単に言うと、MBRはGRUBブートローダーをロードして実行します。
注: MBRはファイルシステムの概念を認識しておらず、ブートローダー自体がそれらを理解してアクセスできるように、サポートされている各ファイルシステムのファイルシステムドライバーをブートローダーに提供する必要があるため、カーネルを直接ロードできなくなりました。 。
この状況を克服するために、GRUBは / boot / grub.conf
およびファイルシステムドライバのファイルシステムの詳細とともに使用されます。
Bootloader
ステージ1が完了し、実際のブートローダーの場所が見つかると、最初のステージのブートローダーは、 Bootloader
をメモリにロードすることによって2番目のステージを開始します。
この段階で、MBRがRAMにロードされた後の最初の30KBハードディスクのGRUB(Grand Unified Bootloader)は、その構成を読み取り、GRUBブートメニュー(ユーザーは手動でブートパラメーターを指定できます)をユーザーに表示します。
GRUBは、ユーザーが選択した(またはデフォルトの)カーネルをメモリにロードし、制御をカーネルに渡します。ユーザーがオペレーティングシステムを選択しない場合、定義されたタイムアウトの後、GRUBはデフォルトのカーネルをメモリにロードして起動します。
gnu.orgによると、「ブートローダーは、コンピューターの起動時に実行される最初のソフトウェアプログラムです。」 GRUBまたは GRand Unified Bootloader
は、Linuxオペレーティングシステムのブートローダーです。 Grubには2つのメジャーバージョンがあります(Grubバージョン1および2)。現在、ほとんどのlinux ditroはgrubバージョン2の使用を開始しています。grubの主な機能の1つは、linuxイメージを使用してインストールでき、オペレーティングシステムを実行する必要がないことです。
Grubはマルチステージブートプログラム(Stage1、Stage1.5、Stage2)です。grubバージョン1とバージョン2の3つのステージを以下に説明します。
GRUBフェーズ1:
GRUBステージ1.5:
GRUBフェーズ2:
元のファイルは/etc/grub.confです。シンボリックリンクファイルは/boot/grub/grub.confで表示できます。
# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root(hd0,0)# kernel /vmlinuz-version ro root=/dev/sda3# initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS(2.6.32-431.el6.x86_64)root(hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=73f96693-ed87-4953-9b51-d6f2cca370eb rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
上記の情報からお気づきのように、カーネルとinitrdイメージが含まれているため、簡単に言うと、GRUBはカーネルとinitrdイメージをロードして実行するだけです。
grub> root(hd0,0)---> rootコマンドは、grubのルートパーティションを指定します
grub> kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root = UUID = 73f96693-ed87-4953-9b51-d6f2cca370eb ....--->指定されたモジュールをロードします
grub> initrd /initramfs-2.6.32-431.el6.x86_64.img ---> initrdファイルを指定します
フェーズ2で説明したように、grub> bootコマンドの後、システム起動の制御はカーネルに移されます。カーネルは、システム内のすべてのデバイスを即座に初期化し、CPU、I / O、ストレージデバイスなどを含む関連する構成作業を実行します。
デバイスドライバのロードに関しては、次の2つの部分があります。
- *デバイスドライバーの一部はLinuxカーネルにコンパイルされ、カーネルはドライバーのこの部分を呼び出して関連デバイスを初期化し、同時にログをカーネルメッセージバッファーに出力します。システムの起動後、dmesgは出力情報のこの部分を表示できます。
- *デバイスドライバの他の部分はカーネルにプログラムされていませんが、モジュールとしてinitrd(ramdisk)に配置されています。
initrd
はメモリベースのファイルシステムです。起動時に、システムが実際のルートファイルシステムにアクセスすると、最初にinitrdファイルシステムにアクセスします。 initrdの内容を開くと、bin、devetc、lib、procsys、sysroot、initなどのファイル(ディレクトリを含む)が見つかります。これには、 scsi ata
やその他のデバイスドライバーモジュールなどのいくつかのデバイスドライバーモジュールと、いくつかの基本的な実行可能プログラムinsmod、modprobe、lvm、nashが含まれています。主な目的は、前述の scsi ideusb
やその他のデバイスドライブモジュールなど、一部のストレージメディアドライブモジュールをロードし、LVMを初期化し、ルートファイルシステムを読み取り専用モードでマウントすることです。
initrd
のコンテンツがrootfsにリリースされた後、Kernelはinitファイルを実行します。initはスクリプトであり、 nash
インタープリターによって実行されます。このとき、カーネルの制御はinitファイルに移されて処理されます。initファイルの内容は、主にさまざまなストレージメディア関連のデバイスドライバをロードするために表示されます。
ドライバがロードされた後、ルートデバイスが作成され、ルートファイルシステムが読み取り専用でマウントされます。この手順の後、未使用のメモリを解放し、 switchroot
を実行して実際のルートに切り替えます。同時に、 / sbin / init
プログラムを実行してシステムのNo.1プロセスを開始し、システム起動の制御をinitプロセスに移します。 switchrootについては、nashで定義されているプログラムです。
Linux Kernel
は、さまざまなハードウェアアーキテクチャに適応する必要がありますが、すべてのハードウェアドライバーをカーネルにコンパイルすることは現実的ではなく、新しいハードウェア構造が開発されるたびに、カーネルがハードウェアのデバイスドライバーをカーネルに書き込むことは不可能です。 。実際、 Linuxカーネル
には基本的なハードウェアドライバーしか含まれていません。システムのインストール中にシステムハードウェア情報が検出され、インストール情報とシステムハードウェア情報に基づいてデバイスドライバーの一部がinitrdに書き込まれます。このように、後でシステムを起動すると、デバイスドライバの一部がinitrdにロードされます。
要約プロセスは次のとおりです。
initプロセスが起動すると、システム起動の制御がinitプロセスに移ります。 / sbin / init
プロセスはすべてのプロセスの親プロセスです。initプロセスが起動すると、最初に構成ファイル / etc / inittab
を読み取り、以下を実行します。仕事:
/ etc / rc.d / rc
を実行します。このファイルは、サービスの起動順序が最初にK、次にSであることを定義し、各実行レベルの特定のサービスステータスが/etc/rc.d/rcn.dに配置されます。 (n = 0〜6)
ディレクトリの下で、すべてのファイルは/etc/init.dの下の対応するファイルにリンクされます。この時点で、ユーザーに提示されるのは最終的なログインインターフェイスです。この時点で、システムの起動プロセスは完了です。
システムの起動実行レベルの概念とサービスのカスタマイズ方法を説明します。
initrd
が正常に検出されてロードできる場合、最終的な作業は基本的にオペレーティングシステムによって実行されます。システムの初期化プロセスが起動すると、システム起動の制御が初期化プロセスに移ります。
/ sbin / initプロセスは、すべてのプロセスの親プロセスです。initが起動すると、最初に構成ファイル / etc / inittab
を読み取って、実行レベルを決定します。
id:3:initdefault:
id:runlevel:action:process
id:このファイルのエントリを識別するために使用される文字の一意のシーケンスです
runlevels:このエントリに適用可能な実行レベルです
action:実行レベルで実行されるアクションです
プロセス:実行するプロセスを指定します
runleve:合計7つのレベルは0〜6、デフォルトのレベルは3です。
runlevel | mean |
---|---|
0 | シャットダウン |
1 | シングルユーザーモード(root、ログイン不要)、シングル、メンテナンスモード; |
2 | マルチユーザーモードは、ネットワーク機能を開始しますが、NFSは開始しません;メンテナンスモード; |
3 | マルチユーザーモード、通常モード、テキストインターフェイス、 |
4 | 予約レベル; 3レベルと同じにすることができます; |
5 | マルチユーザーモード、通常モード、グラフィカルインターフェイス、 |
6 | 再起動 |
次のように、めったに使用されない追加の実行レベルがいくつかあります。
s、Sまたはシングル:シングルユーザーモード
緊急:rc.sysinitをバイパスする
実行レベルを要約すると:
実行レベル1は非常に制限された実行レベルであるため、メンテナンスの目的で使用されます。この実行レベルでは、最小限のスクリプトのみが実行されます。 rootユーザーのみがログインできます。他のユーザーはこの実行レベルにログインできません。実行レベル2は、実行レベル1よりも寛容です。ここでは、すべてのユーザーがログインできますが、ネットワークサービスは実行されていません。実行レベル3は、完全な作業環境を提供します。すべてのユーザーがログインしてネットワークを有効にできます。実行レベル4は、実験のみを目的としています。実行レベル5では、グラフィカルコンソールを使用できます。実行レベル「0」はシステムの一時停止状態です。実行レベル6に切り替えると、システムが再起動します。
アクション | 意味 |
---|---|
待機 | このレベルに切り替えて1回実行 |
respawn | このプロセスは終了し、再起動します |
initdefault | initのデフォルトの実行レベルを設定します |
sysinit | システム初期化モードを設定します。/etc/rc.d/rc.sysinit |
.... | 上記は一般的なアクションです |
次に、initは / etc / rc.d / rc.sysinit
スクリプトを実行します。これは、ブートプロセス中にinitによって実行される最初のスクリプトです。
スクリプトは起動時に1回だけ実行され、次のアクションを実行します。
rc.sysinitの完了後、カーネルは/etc/rc.d/rcx.d/ディレクトリを調べます(Xは/ etc / inittabから取得した実行レベルです)。
/ etc / rc.d
ディレクトリには、各実行レベルに対応するディレクトリがあります。この行に従って、 / etc / rc.d / rc3.d
ディレクトリでスクリプトを実行します。このディレクトリにファイルをリストします。 (rc1.d、rc2.d ...などの他のディレクトリにも同様のファイルがあります)。
[ [email protected]~]# ls -l /etc/rc.d/rc3.d/合計金額0
lrwxrwxrwx.1ルートルート199 2016年5月19日K10saslauthd->../init.d/saslauthd
lrwxrwxrwx.1ルートルート2016年11月17日22日K14zabbix-agent ->../init.d/zabbix-agent
lrwxrwxrwx1ルートルート225 2018年9月K15htcacheclean->../init.d/htcacheclean
lrwxrwxrwx1ルートルート155 2018年9月9日K15httpd->../init.d/httpd
lrwxrwxrwx.1ルートルート2016年11月15日K15svnserve->../init.d/svnserve
lrwxrwxrwx.1ルートルート209 2016年2月19日K50netconsole->../init.d/netconsole
lrwxrwxrwx.1ルートルート2016年11月15日K50snmpd->../init.d/snmpd
lrwxrwxrwx.1ルートルート2016年11月15日K50snmptrapd->../init.d/snmptrapd
lrwxrwxrwx.1ルートルート2016年11月15日K74ntpd->../init.d/ntpd
lrwxrwxrwx.1ルートルート2016年11月15日K75ntpdate->../init.d/ntpdate
lrwxrwxrwx.1ルートルート219 2016年2月19日K87restorecond->../init.d/restorecond
lrwxrwxrwx.1ルートルート159 2016年5月19日K89rdisc->../init.d/rdisc
lrwxrwxrwx1ルートルート182月232018K92iptables->../init.d/iptables
lrwxrwxrwx.1ルートルート2016年9月19日S08ip6tables->../init.d/ip6tables
lrwxrwxrwx.1ルートルート179 2016年2月19日S10network->../init.d/network
lrwxrwxrwx.1ルートルート169 2016年3月19日S11auditd->../init.d/auditd
lrwxrwxrwx.1ルートルート179 2016年12月19日S12rsyslog->../init.d/rsyslog
lrwxrwxrwx.1ルートルート159 2016年5月19日S25netfs->../init.d/netfs
lrwxrwxrwx.1ルートルート2016年9月19日S26udev-post ->../init.d/udev-post
lrwxrwxrwx1ルートルート1452102:16 S55sshd ->../init.d/sshd
lrwxrwxrwx1ルートルート155 2018年5月9日S59Redis->../init.d/Redis
lrwxrwxrwx1ルートルート175 2018年11月11日S69Tengine->../init.d/Tengine
lrwxrwxrwx1ルートルート147か月2306:09 S80exim ->../init.d/exim
lrwxrwxrwx1ルートルート157 2306年3月:09 S90crond ->../init.d/crond
lrwxrwxrwx.1ルートルート119 2016年12月19日S99local->../rc.local
このディレクトリ内の一部のファイルは S
で始まり、他のファイルは K
で始まります。 「S」で始まるファイルは、その特定の実行レベルで「開始」する必要があるスクリプトに対応し、「K」で始まるファイルは、「強制終了」するスクリプトに対応します。これらのファイルは、 / etc / rc.d / init / d
ディレクトリ内のスクリプトへの単なるソフトリンクです(ソフトリンクは、それ自体が / etc / rc.d / rc / local
である / etc / rc.local
を指します。ソフトリンク。)。 / etc / rc.d / init.d /
のスクリプトはデーモンです。デーモンは、バックグラウンドで実行され、特定のサービスを提供するプロセスです。たとえば、httpデーモン(httpd)はWebサービスを提供します。
これらすべてのスクリプトを実行した後、 / etc / rc.local
スクリプトが実行され、initは / etc / rc.d / rc.local
で見つかったものをすべて実行します(実行レベルに関係なく)。 rc.local
は非常に特別で、実行レベルが変更されるたびに実行されます。これは、初期化プロセスまたは起動プロセス中に実行される最後のスクリプトです。すべてが完了すると、制御はカーネルに戻ります。
注:
rc.local
はすべてのディストリビューションで使用されているわけではありません。たとえば、Debianにはこのファイルがありません。
システムの起動時にコマンドまたはスクリプトを実行する場合は、次のスクリプトに含めることができます。
[ [email protected]~]# cat /etc/rc.local #!/bin/sh## This script will be executed *after* all the other init scripts.# You can put your own initialization stuff in here if you don't# want to do the full Sys V style init stuff.touch /var/lock/subsys/local# start solution service/data/app/data-solution-service/solution-start.sh
これで、これらのスクリプトはすべて正常に実行されました。
ターミナルを起動
次に、/ sbin / mingettyコマンドで端末を起動します。システムはtty1-tty6を起動するように設定されているため、6つのコマンドライン端末が起動します。私たちが最終的に私たちに提示したのは、そのような写真です。
/ bin / login
/ etc / passwdファイルを読み取ることにより、ログインが成功した後に対話型ログインシェルが開始されます。このシェル呼び出しは通常、起動時に/ etc / profileとそのプライベート構成アイテム 〜/ .bash_profile
、〜/ .bash_login
、 〜/ .profile
を読み取ります。
通常、シェルプログラム([prompt] $ / bin / bashなど)または/ bin / suコマンドを使用して、コマンドラインで対話型の非ログインシェルを開始します。 xtermやkonsoleなどのターミナルプログラムを使用して、グラフィカル環境でインタラクティブな非ログインシェルを開始することもできます。このタイプのシェル呼び出しは通常、親環境をコピーしてから、ユーザーの〜/ .bashrcファイルを読み取って、他の起動構成命令を取得します。
シェルスクリプトの実行中は、通常、非対話型シェルが表示されます。コマンド間のユーザー入力を待つのではなく、スクリプトを処理しているため、非対話型です。これらのシェル呼び出しでは、親シェルから継承された環境のみが使用されます。
ファイル 〜/ .bash_logout
は、シェルの呼び出しには使用されません。ユーザーが対話型ログインシェルを終了すると、読み取りと実行が行われます。
多くのディストリビューション/ etc / bashrcは、非ログインシェルのシステム全体の初期化に使用されます。このファイルは通常、bash自体に直接組み込まれているのではなく、ユーザーの〜/ .bashrcファイルから呼び出されます。このセクションは、この規則に従います。
/etc/profile:
このファイルは、最初にいくつかの補助機能といくつかの基本パラメーターを設定します。いくつかのbash履歴パラメーターを指定し、セキュリティ上の理由から、rootユーザーの永続的な履歴ファイルを保持することは禁止されています。また、デフォルトのユーザープロンプトを設定します。次に、ディレクトリ内の小さな単一目的スクリプト / etc / profile.d
を呼び出して、初期化のほとんどを提供します。
Recommended Posts