新搭載のGRUB 2とCentOS 7でのレスキューモード
前回に引き続き、CentOS 7のインストーラーの変更点についてみていきます。今回は、新しく搭載されたGRUB 2、運用管理者が知っておくべきCentOS 7でのレスキューモードの利用方法についてご紹介します。
CentOS 7で採用された新ブートローダ「GRUB 2」
CentOS 7から、ブートローダにGRUB 2が採用されています。従来のCentOS 6系までのGRUBと構造が大きく異なるため、注意が必要です。以下では、CentOS 7の管理者が、最低限知っておくべきGRUB 2の設定方法について紹介します。
GRUB 2の設定の基本は、/etc/default/grubファイルの編集と、grub2-mkconfigコマンドによる設定ファイルの生成です。GRUB 2の設定ファイル/etc/default/grubファイルにパラメータを設定し、grub2-mkconfigによってその設定を含んだファイル/boot/grub2/grub2.cfgファイルを生成します。
以下は、GRUB 2メニューが表示される時間(タイムアウト)を60秒に設定し、さらにIPv6を無効にする例です。タイムアウト値は、/etc/default/grubファイルの「GRUB_TIMEOUT=」に設定します。ブートパラメータは、/etc/default/grubファイルの「GRUB_CMDLINE_LINUX=」に設定します。
# vi /etc/default/grub GRUB_TIMEOUT=60 ←デフォルトの5を60に変更 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet ipv6.disable=1" ←IPv6を無効化するパラメータを追加 GRUB_DISABLE_RECOVERY="true" ~
上記/etc/default/grubファイルの変更を有効にするため、/boot/grub2/grub.cfgを再生成します。
# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.org # grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.6.3.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-41f28cff512735f914d4f894f1944df1 Found initrd image: /boot/initramfs-0-rescue-41f28cff512735f914d4f894f1944df1.img done
BIOS搭載マシンとUEFI搭載マシンでgrub2-mkconfigコマンドで出力するファイルgrub.cfgファイルのパスが異なりますので注意して下さい。
BIOS搭載マシン
# grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI搭載マシン
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
OSを再起動してタイムアウト値が反映されているかを確認します。
# reboot
OSのブートメニューが表示されたら、メニュー画面が60秒間表示されていることを確認します。OSが起動したら、ブートパラメータが有効になっているかを確認します。
# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1 ro nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet ipv6.disable=1
以上でカーネルのパラメータを変更することができました。CentOS 6系に慣れた管理者は、grub2-mkconfigコマンドを実行することを忘れてしまうミスを犯しがちです。GRUB 2の設定は慎重に行うようにして下さい。
ブートメニューのエントリーを追加する方法
GRUB 2では、複数のブートメニューエントリーが/boot/grub2/grub.cfgファイルに生成されますが、独自のブートパラメータを含んだカスタムのブートメニューエントリーを追加したい場合、grub.cfgファイルを直接編集することはできません。そこで、GRUB 2では、/etc/grub.d/40_customファイルを使用します。このファイルに、カスタムのエントリーを追加することができます。以下では、既存のエントリーにさらにカスタムのエントリーを追加する例です。
まず、cpコマンドで、既存の41_customファイルのバックアップを取っておき、バックアップを取ったファイルの実行権限を削除します。
# cd /etc/grub.d/ # cp 40_custom 40_custom.org # chmod -x 40_custom.org
カスタムのエントリーを40_customファイルに記述します。
# vi 40_custom menuentry 'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 033eb63d-33d5-49e4-b045-463f2297ccaa else search --no-floppy --fs-uuid --set=root 033eb63d-33d5-49e4-b045-463f2297ccaa fi linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1 ro nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 rhgb quiet ipv6.disable=0 initrd16 /initramfs-3.10.0-123.el7.x86_64.img }
今回は、カスタムメニューを追加したことがわかるように、上記ファイルのmenuentry行に、'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64'を記載しました。
さらに、追加したカスタムメニューがOS起動時に自動的に選択されるように/etc/default/grubファイルを編集します。複数あるエントリーから特定のものを選択してデフォルトで起動させるには、40_custom ファイルのmenuentry行で、''で囲んだエントリー名の文字列をGRUB_DEFAULT行にそのまま記述することが可能です。
# vi /etc/default/grub ... GRUB_DEFAULT='CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' ...
/boot/grub2/grub.cfgファイルを生成します。
# grub2-mkconfig -o /boot/grub2/grub.cfg
ブート可能なカーネルのエントリーを表示するには、/boot/gurb2/grub.cfgファイルのmenuentryの以下の'CentOS Linux, ...'の箇所を確認します。
# cat /boot/grub2/grub.cfg |grep ^menuentry menuentry 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.6.3.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CentOS Linux, with Linux 0-rescue-41f28cff512735f914d4f894f1944df1' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-41f28cff512735f914d4f894f1944df1-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' {
また、以下のようにawkコマンドを駆使することで、'CentOS Linux...'の箇所のみを抽出することもできます。
# awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg CentOS Linux, with Linux 3.10.0-123.el7.x86_64 CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64 CentOS Linux, with Linux 0-rescue-41f28cff512735f914d4f894f1944df1 CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64
上記より、メニューエントリー' CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64'が登録されていることがわかります。以上で、新しく追加したカスタムのエントリーで起動する準備が整いましたので、OSを再起動します。
# reboot
OS再起動後に、自動的にカスタムのメニューが選択され、正常に起動するかを確認してください。
先述のawkコマンドを駆使したエントリーの表示では、4つのエントリーが表示されていますが、デフォルトで起動してほしいエントリーは、/etc/default/grubファイル内で、数字で指定することも可能です。たとえば、先述のawkコマンドの出力結果の一番上に出力されている「CentOS Linux, with Linux 3.10.0-123.el7.x86_64」をブート時にデフォルトで起動させる場合は、/etc/default/grubファイルのGRUB_DEFAULT=0を指定します。
# vi /etc/default/grub ... GRUB_DEFAULT=0 ...
/etc/default/grubファイルを更新したら、必ず/boot/grub2/grub.cfgファイルを生成してからOSを再起動して下さい。
# grub2-mkconfig -o /boot/grub2/grub.cfg && reboot
レスキューモードを使った復旧手順
CentOS 7では、レスキューモードが用意されています。このレスキューモードは、ローカルマシンにインストールされたCentOS 7が起動不能に陥った際に、それを復旧する役目を担います。また、レスキューモードを使えば、起動不能に陥ったCentOS 7からユーザーデータを取り出すことも可能です。以下では、CentOS 7のレスキューモードを使った復旧手順やユーザーデータの取得、さらに、ディスクイメージ全体の取得について解説します。
パッケージの上書きインストールによる復旧手順
OSが起動しなくなる原因は、施設の停電による突然の電源断や、管理者のオペレーションミス、ディスク障害など様々なものがあります。通常、ディスク障害や停電による電源断によってハードウェアやOSの設定状況に深刻なダメージがある場合は、ハードウェアの交換を行い、OSの再インストールを行うことが一般的です。しかし、ハードウェアの障害ではなく、管理者のオペレーションミスによってOSの起動に関わるプログラムを誤って削除する、あるいは、起動スクリプトの動作テストが不十分なことに起因したOSの起動障害に陥るといった場合は、CentOS 7のインストーラーが持つレスキューモードによって復旧することが可能です。
レスキューモードでは、通常、ローカルディスクにインストールされている既存のCentOS 7を認識します。レスキューモードにおける/mnt/sysimageディレクトリ配下に対して、ローカルディスクにインストールされている既存のCentOS 7を読み書き可能な状態でマウントさせる事が可能です。これにより、ローカルディスクにインストールされている既存のCentOS 7に対して様々な操作を施すことが可能になります。
図7:レスキューモードにおいて「Continue」を選択すると、ローカルディスクにインストールされた既存のCentOS 7を/mnt/sysimageディレクトリに読み書き可能でマウントする。書き込み不可の状態でマウントする場合は、「Read-Only」を選択する(クリックで拡大)
レスキューモードで、どのようにローカルディスクが見えているかをdfコマンドで確認します。すると、/mnt/sysimageディレクトリに、ローカルディスクにインストールされた既存のCentOS 7が見えていることが確認できます。また、CentOS 7のインストールメディアは、/run/install/repoディレクトリにマウントされます。
レスキューモードでは、/mnt/sysimageディレクトリ配下にマウントされた既存のCentOS 7に対して、CentOS 7のメディアを使って、RPMパッケージ等を上書きインストールすることが可能です。例えば、なんらかの理由でmountコマンド自体が機能しなくなったと仮定します。mountコマンドが機能しない場合、システムはパーティションのマウントに失敗するため、OSの起動に失敗します。そこで、mountコマンドが含まれるutil-linux RPMパッケージをレスキューモードで再インストールします。インストールを行うには、rpmコマンドのオプションとして、-vhi --force --root /mnt/sysimageを指定します。これにより、/mnt/sysimage配下をルートパーティションとみなして既存のCentOS 7にパッケージを強制的にインストールすることができます。これにより、mountコマンドが含まれるutil-linux RPMパッケージがインストールされ、mountコマンドの復旧が実現できます。
図9:レスキューモードで、util-linux RPMパッケージを/mnt/sysimageディレクトリにマウントされた既存のローカルディスクのCentOS 7に強制的にインストールしている様子(クリックで拡大)
レスキューモードを終了するには、rebootコマンドでレスキューモードを離脱し、システムを再起動してください。
レスキューモードでのユーザーデータの救出
CentOS 7のOS本体に致命的なダメージがあり、OSの起動が困難な場合でも、ユーザーデータのみを救出したい場合があります。ユーザーデータの救出は、レスキューモードを使って行うことが可能です。ユーザーデータがUSBメモリやブルーレイDVDメディア等に入る程度の小さい場合は、レスキューモードの状態で、メディアをマウントすることでユーザーデータを退避できます。しかし、ユーザーデータがテラバイト級になる場合は、テープ装置の利用や、ネットワーク経由で別のファイルサーバー等にユーザーデータを転送する方法が一般的です。以下では、レスキューモードにおいて、ネットワーク経由で別のファイルサーバー等にユーザーデータを転送する例を示します。まず、レスキューモードで起動し、ネットワーク通信ができるように、NICにIPアドレスを付与します。IPアドレスの付与が可能なNIC一覧をipコマンドで表示します。
ipコマンドで利用可能なNICが確認できたら、IPアドレスを付与します。以下の例では、IPアドレスとして、172.16.25.2/16を付与しています。このIPアドレスの付与は、対象サーバーのメモリ上で行われていますので、設定は恒久的なものでもなく、既存のローカルディスクにインストールされたCentOS 7の物理NICの設定に影響を与えません。
CentOS 7のレスキューモードでは、scpコマンドを利用することが可能ですので、遠隔にあるファイルサーバー等にscpコマンドを使ってユーザーデータをコピーすることが可能です。これにより、起動不可のCentOS 7のシステムからユーザーデータを救出が実現できます。
レスキューモードでのHDDイメージ全体の遠隔地への転送
マスターブートレコードを含むOS全体とユーザーデータ全てをイメージファイルとして遠隔のファイルサーバーに保管しておきたい場合があります。ローカルディスクにインストールされたOS全体をイメージファイルとして保管するには、CentOS 7のレスキューモードを活用できます。レスキューモードを使って、ディスク全体を遠隔のファイルサーバーにイメージファイルとして転送する手段としては、ddコマンドとsshコマンド、そしてcatコマンドを組合せます。まず、レスキューモードに移行し、先述の手順で、事前にネットワークの設定を行い、遠隔のファイルサーバーとscpやsshコマンドによるセキュア通信が可能な状態にしておきます。次に、イメージファイルとして取得するディスクの情報をpartedコマンドで出力します。下図の例では、3テラバイトのローカルディスクの/dev/sdaが、レスキューモードから認識できていることがわかります。
/dev/sda全体を遠隔のファイルサーバーにイメージファイルとして圧縮して転送します。/dev/sda全体をイメージ化するには、ddコマンドを使います。転送を行うには、sshコマンドを使用しますが、イメージファイルが巨大な場合は、gzipコマンドを組み合わせて圧縮するとよいでしょう。通常巨大ファイルの転送は、膨大な時間がかかりますので、今後、同様のイメージファイルの取得作業のスケジュール管理のためにも、コマンドの実行時間を計測しておくのがよいでしょう。コマンドの実行時間を計測するには、timeコマンドを付与します。下図は、遠隔のファイルサーバー(IPアドレスは172.16.25.4)の/backupディレクトリ以下に、n01sda_c70_20141007.img.gzというファイル名で保存する例です。
図14:レスキューモードを使ったローカルディスクのイメージファイルの取得の様子。遠隔のファイルサーバーにsshを使って転送している。パーティションが巨大のため、gzipにより圧縮を行っている(クリックで拡大)
まとめ
以上で、CentOS 7に関するインストールの新機能やOSの起動の仕組み、復旧のノウハウについて解説しました。CentOS 7のインストール自体は、非常に簡単ですが、インストール前の調査等、適切な情報収集が欠かせません。また、ブートローダの仕組みも従来のCentOS 6までと大きく異なっていますので、注意が必要です。不慣れなブートローダの設定ミスにより、CentOS 7が起動できなくなった場合は、レスキューモードが役に立ちますので、擬似的な障害を発生させてみてレスキューモードによる復旧の練習をしておくことをお勧めします。以下に、ポイントをまとめておきます。
- CentOS 7のインストール前にハードウェアの設定を適切に行っておく
- インストーラーにはトラブルシューティングモードが用意されている
- 従来のCentOS 6に比べ、CentOS 7のテキストモードのインストーラーは、機能が大幅に強化されている
- ブートローダの設定は、/etc/default/grubと/etc/grub.d/40_customファイルに記述する
- レスキューモードでは、パッケージのインストール、ユーザーデータやイメージファイルの転送が可能
この記事の著者
古賀 政純
兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを3度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード