新搭載のGRUB 2とCentOS 7でのレスキューモード

2014年11月28日(金)
古賀 政純

前回に引き続き、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コマンドで、既存の40_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のインストーラーが持つレスキューモードによって復旧することが可能です。

図5:レスキューモードに移行するには、CentOS 7のインストールメディアで起動後、「Troubleshooting」を選択する(クリックで拡大)

図6:Troubleshootingを選択後、「Rescue a CentOS system」を選択するとレスキューモードに移行する(クリックで拡大)

レスキューモードでは、通常、ローカルディスクにインストールされている既存の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ディレクトリにマウントされます。

図8:レスキューモードにおいて、/mnt/sysimageディレクトリ配下にローカルディスクにインストールされた既存のCentOS 7のパーティションが見える(クリックで拡大)

レスキューモードでは、/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コマンドで表示します。

図10:レスキューモードで、ipコマンドを使って利用可能なNICを確認する(クリックで拡大)

ipコマンドで利用可能なNICが確認できたら、IPアドレスを付与します。以下の例では、IPアドレスとして、172.16.25.2/16を付与しています。このIPアドレスの付与は、対象サーバーのメモリ上で行われていますので、設定は恒久的なものでもなく、既存のローカルディスクにインストールされたCentOS 7の物理NICの設定に影響を与えません。

図11:ipコマンドを使って利用可能なNICにIPアドレスを付与する(クリックで拡大)

CentOS 7のレスキューモードでは、scpコマンドを利用することが可能ですので、遠隔にあるファイルサーバー等にscpコマンドを使ってユーザーデータをコピーすることが可能です。これにより、起動不可のCentOS 7のシステムからユーザーデータを救出が実現できます。

図12:レスキューモードでscpコマンドを使ってユーザーデータを救出している様子(クリックで拡大)

レスキューモードでのHDDイメージ全体の遠隔地への転送

マスターブートレコードを含むOS全体とユーザーデータ全てをイメージファイルとして遠隔のファイルサーバーに保管しておきたい場合があります。ローカルディスクにインストールされたOS全体をイメージファイルとして保管するには、CentOS 7のレスキューモードを活用できます。レスキューモードを使って、ディスク全体を遠隔のファイルサーバーにイメージファイルとして転送する手段としては、ddコマンドとsshコマンド、そしてcatコマンドを組合せます。まず、レスキューモードに移行し、先述の手順で、事前にネットワークの設定を行い、遠隔のファイルサーバーとscpやsshコマンドによるセキュア通信が可能な状態にしておきます。次に、イメージファイルとして取得するディスクの情報をpartedコマンドで出力します。下図の例では、3テラバイトのローカルディスクの/dev/sdaが、レスキューモードから認識できていることがわかります。

図13:レスキューモードでpartedコマンドにより、ローカルディスクの/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ファイルに記述する
  • レスキューモードでは、パッケージのインストール、ユーザーデータやイメージファイルの転送が可能
この連載が書籍になりました!
CentOS 7実践ガイド

古賀 政純 著
価格:3,000円+税
発売日:2015年2月25日発売
ISBN:978-4-8443-3753-9
発行:インプレスジャパン

CentOS 7実践ガイド

本書は、CentOS 7を取り巻く市場動向、CentOS 7が利用されるサーバーシステムの選定、CentOS 7の基礎、システム設計、OS管理やCentOS 7に対応したアプリケーションサーバーの構築手順などの勘所をご紹介します。連載では書ききれなかった本の内容、見どころが満載!

  • セキュリティ管理
  • チューニング
  • 自動インストール
  • Hadoop構築
  • GlusterFS
  • Ceph

Amazon詳細ページへImpress詳細ページへ

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、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公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています