読者です 読者をやめる 読者になる 読者になる

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

CentOSでXが起動しないときの対処法

CentOS


********
追記(20161207)

本記事のとおりに設定していてもある日突然Xが起動しなくなることがありました.その時はNVIDIAのドライバをアップデートしてください.
NVIDIAドライバダウンロード

今のところ以下の設定とNVIDIAドライバのアップデートをすることで,Xが起動しないことはなくなりました.
********


環境:CentOS6.5もしくは6.6

けっこう前のことだがメモメモ.
症状としては,電源を付けた後,下の画像のように起動中の画面は出るが,この画面で止まってしまい,GUIが立ち上がらないというもの.
f:id:kichiku_kikuchi:20150409122651j:plain
http://kb.seeck.jp/archives/4534より

調べてもなかなか情報が見当たらず,結構苦労しました.

対処法① 一時しのぎ

ぐちゃぐちゃトラブルシューティングをしてるヒマがない場合は,とりあえず次の方法を試してみてください.
まず,CentOS起動待機中にキーボードで"e"を押して,カーネルバージョンの選択画面を表示させます.
f:id:kichiku_kikuchi:20150409123740p:plain
http://www.obenri.com/_operation/singleuser.htmlより
ここで,一番上の最新のカーネルではなく,他の古いカーネルで起動してみてください.そうするとうまくXが立ち上がることがあります.(このことから,最新のカーネルとGUI間で何らかの不具合が起きてそうなことがわかります.)

この状態で,NVIDIAのアップデートなどをしておくとよいかもしれません.

また,この方法だと毎回カーネルバージョンを指定して起動しなければなりません.もし古いカーネルを使ってしばらく作業したいなら,デフォルトのカーネルを設定しておきます.エディタで/etc/grub.confを開き,

f:id:kichiku_kikuchi:20150409132724p:plain

"default=0"となっているところを変更します.下に並んでいるのがカーネルのバージョンで,最新のものから,0,1,2...の番号に対応しています.ここを"default=1"にすれば,上から2つ目のカーネルで起動することになります.

対処法② たぶん根本的解決

しばらく,対処法①でお茶を濁していたところ,ついにどのカーネルでも起動できなくなってしまいました.おそらく,起動画面で出てくるカーネルはアップデートのたびに更新されているのでしょう.

5時間ぐらいかけてトラブルシューティングしますた.

  1. 前回の記事で紹介したシングルユーザーモードで起動する.
    kichiku-kikuchi.hatenablog.com
  2. この後しばらくCUIで作業するので,/etc/inittabを編集しておきましょう.

    # inittab is only used by upstart for the default runlevel.
    #
    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # System initialization is started by /etc/init/rcS.conf
    #
    # Individual runlevels are started by /etc/init/rc.conf
    #
    # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
    #
    # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
    # with configuration in /etc/sysconfig/init.
    #
    # For information on how to write upstart event handlers, or how
    # upstart works, see init(5), init(8), and initctl(8).
    #
    # Default runlevel. The runlevels used are:
    #   0 - halt (Do NOT set initdefault to this)
    #   1 - Single user mode
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    #   3 - Full multiuser mode
    #   4 - unused
    #   5 - X11
    #   6 - reboot (Do NOT set initdefault to this)
    #
    id:5:initdefault:
    

    一番下の行を

    id:3:initdefault:
    

    と書き換えます.

  3. startx
    

    してみます.エラーコメントを保存し忘れたのですが,

    Module nvidia not found
    

    というコメントがどこかにありました.これが出たらたぶん以下の手順で直ります.それ以外の場合は,下の”その他”を見てみてください.

  4. NVIDIAのドライバは確実に入っているので,多分パス的なものが通っていないのでしょう.LinuxのX Windows SystemはXorgというオープンソースのやーつにより提供されています.Xorgの設定ファイルを見てみます./etc/X11/xorg.confを見てみると,

    Section "Device"
        Identifier     "Device0"
        Driver         "nvidia"
        VendorName     "NVIDIA Corporation"
    EndSection
    

    と,ドライバはnvidiaが指定されています.しかし,モジュールの設定はされていないようです.モジュールのパスは,Section "Files"で指定すればよいようです(どこのサイトで見たのか忘れました).

    では,NVIDIAのモジュールのパスはどこでしょうか...NVIDIAのREADMEに書いてありました.
    READMEがある場所は/usr/share/doc/NVIDIA_GLX-1.0/でした.バージョンにより少し違うかも知れません.

    ______________________________________________________________________________
    
    Chapter 5. Listing of Installed Components
    ______________________________________________________________________________
    
    The NVIDIA Accelerated Linux Graphics Driver consists of the following
    components (filenames in parentheses are the full names of the components
    after installation; "x.y.z" denotes the current version. In these cases
    appropriate symlinks are created during installation):
    
       o An X driver (/usr/X11R6/lib/modules/drivers/nvidia_drv.so); this driver
         is needed by the X server to use your NVIDIA hardware.
    
       o A GLX extension module for X
         (/usr/X11R6/lib/modules/extensions/libglx.so.x.y.z); this module is used
         by the X server to provide server-side GLX support.
    
    (つづく)
    

    ドライバが
    /usr/X11R6/lib/modules/drivers/nvidia_drv.so
    エクステンションモジュールが/usr/X11R6/lib/modules/extensions/libglx.so.x.y.z
    だそうです./usr/X11R6/がなかったので,その近辺を探してみると,それぞれ,

    /usr/lib64/xorg/modules/drivers/
    /usr/lib64/xorg/modules/extensions

    にありました.ためしに,/etc/X11/xorg.confのSection "Files"に

    ModulePath      "/usr/lib64/xorg/modules"
    

    を追加して,startxしてみたのですが,これではダメなようです.ちゃんとモジュールファイルがあるディレクトリを指定します.

    ModulePath      "/usr/lib64/xorg/modules/extensions"
    

    と追加してもう一度startx.やっとXが立ち上がりました.ツカレタ.結局僕の設定はこうなっています.
    ※追記(2015/8/14) 後日また同じ症状が出ましたが,以下のように追加したら治りました.とりあえずこれで一安心?

    Section "Files"
        FontPath        "/usr/share/fonts/default/Type1"
        ModulePath      "/usr/lib64/xorg/modules"
        ModulePath      "/usr/lib64/xorg/modules/extensions"
      ModulePath      "/usr/lib64/xorg/modules/drivers"
    EndSection
    

  5. 起動に成功したら/etc/inittabをもとに戻しておきましょう.また,なぜか英語表記になっていましたが,再起動したら直りました.

その他

紹介した方法は,NVIDIAのモジュールにパスが通っていないことが原因の場合にしか使えないと思います.
NVIDIAのドライバをアップデートして

NVRM: API mismatch: ...

というエラーが出てXが立ち上がらない場合は以下のサイトを見てみてください(Debianの場合ですが...).
NVIDIAの新しいドライバを入れたらXが起動しなくなった - akihiko’s tech note

カーネルパラメータにnomodesetを渡してNVIDIAではなくnouveauで起動する方法については以下のサイトを見てみてください.この症状の原因についても言及しています.
本の虫: nomodesetとLinuxにおけるGPUドライバーの問題



↓アフェカスリンク
CentOS7で作るネットワークサーバ構築ガイド (Network server construction gu)
CentOS7で作るネットワークサーバ構築ガイド (Network server construction gu)