Chienomi

Manjaro LinuxのXが起動しなくなった

xwindow

12-20のシステムアップグレードリリースでManjaroを再起動した際、Xが起動しなくなった。

[ 32.722] (II) fglrx(0): Desc: AMD FireGL DRM kernel module [ 32.722] (II) fglrx(0): Kernel Module version matches driver. [ 32.722] (II) fglrx(0): Kernel Module Build Time Information: [ 32.722] (II) fglrx(0): Build-Kernel UTS_RELEASE: 3.18.0-0-MANJARO [ 32.722] (II) fglrx(0): Build-Kernel MODVERSIONS: no [ 32.722] (II) fglrx(0): Build-Kernel __SMP__: no [ 32.722] (II) fglrx(0): Build-Kernel PAGE_SIZE: 0x1000 [ 32.722] (II) fglrx(0): [uki] register handle = 0x00016000 [ 32.722] (II) fglrx(0): DRI initialization successfull [ 32.722] (II) fglrx(0): FBADPhys: 0xf400000000 FBMappedSize: 0x010e0000 (==) Log file: "/var/log/Xorg.0.log", Time: Sat Dec 20 23:57:18 2014 (==) Using config file: "/etc/X11/xorg.conf" (==) Using config directory: "/etc/X11/xorg.conf.d" (==) Using system config directory "/usr/share/X11/xorg.conf.d" (WW) fglrx: No matching Device section for instance (BusID PCI:0@0:1:1) found /usr/bin/Xorg.bin: symbol lookup error: /usr/lib/xorg/modules/drivers/fglrx_drv.so: undefined symbol: GlxInitVisuals2D

検索すると事例はかなり多く見つかるが、そのほとんどはaticonfig --initialしろというものだ。

だが、これでうまくはいかなかった。nomodesetしろという声もあったが、それはすでにしてあるし、確認もした。

そのほかにはflgrxを無効にする方法について記述されたものがある程度で、それ以外はインストールしろか、もしくは解決しないままか、だ。

かなり深く調べた。エラーでは0:1:1となっているが、本当にBusIDの不一致を疑って調べると0:1:0だったので、それが原因かと思って調べたりもした。だが、結局解決にはつながらなかった。

バックアップしたイメージでロールバック、ということも考えたのだが、まずは総再ビルド&インストール。もし、パッケージが壊れたためならこれで解決する。もともと壊れていたのなら、ロールバックしてアップグレードしても同じことになる。

やり方は次のようなもの。

for i in $(pacman -Q | cut -f 1 -d " ") do yaourt -S --noconfirm "$i" done

sudo時間は長くしておくほうが良い。

だが、うちの場合、頻繁に、長時間に渡ってネットワークダウンが生じる。上流で起きていること(おそらく、回線、集合回線部分のせいだろう)なので私には手出しできない。フルビルドで回っている間ネットワークがダウンすると失敗する。これはなかなか恐ろしい。

幸いにもネットワークダウンには遭遇せず2回完走したのだが、改善しなかった。そこでロールバックを試みたのだが、dumpしたイメージをrestore(8)しようとしたが、0 inode fileと言われ、14GBもあるファイルにもかかわらずできなかった。

システム再インストールしかなくなってしまったが、せめてもということで、pacman -Qの結果を外部に保存しておく。

再インストールだが、Manjaro 0.8.11 Xfce JPのイメージのインストーラではkeymap選択画面でフリーズしてしまい、進まない。0.8.10 XFce JPイメージでインストールする。

2014-11-05のarticleにある手順でセットアップ。

  • pacman-keyの再構築、無効なキーの削除
  • aticonfig
  • vigrでusersのGIDを500

そしてパッケージを復帰させる。いくつか試したが、sudoのtimeoutを無効にした上で

for i in $(ruby -e 'list1 = `pacman -Q | cut -f 1 -d " "`.split("\n")' -e 'list2 = `cut -f 1 -d " " paclist`.split("\n")' -e 'list2.each {|i| next if list1.include?(i); puts i}' ) do yes Y | yaourt -S "$i" done

--noconfirmではconfrict時に中止を選択されてしまう。基本的にはこれで通るが、MATE関連でgstreamerかpulseaudioか選べと言われてYを返しても通らないため、チェックしてこの時に一旦INTしてmate関連を手動インストールの上、やり直す。ちなみに、依存関係で入るパッケージもこの方法だと再インストールするため、mozc-utなどはfcitx-mozc-utで入るのだから途中で中断してやり直したほうが早い。

これを避ける方法としては

while p=$(ruby -e 'list1 = `pacman -Q | cut -f 1 -d " "`.split("\n")' -e 'list2 = `cut -f 1 -d " " paclist`.split("\n")' -e 'list2.each {|i| next if list1.include?(i); puts i}' | head -n 1) [[ -n "$p" ]] do yes Y | yaourt -S "$i" done

で、その他の選択肢を要求する場合を除いていけると思う。だだし、そもそもビルドできないパッケージがあると、それはインストールできないため詰んで(ループして)しまう。監視なしにするにはexpectを使うしかない。なお、xpdf関連は無理だった。

この後は次のようにしてセットアップを進める

  • バックアップしたhomeのイメージをrsync。この時、rsync -av /mnt/1/ --exclude share/ /home/としてマウントされるユーザーデータは回避する。
  • このままではユーザーデータがマウントできないので、sudo -u aki mkdir ~aki/share ~aki/.share.encfsとする。
  • /etc/fstabを編集。tmpfsと~/.share.encfs(btrfsサブボリューム)のマウントを設定。 encfsをマウントするためのスクリプトを~/root/binに書く。
  • これでほぼ通常通り。リブートしてakiでログインし、Catalyst Control Centerを起動、設定すればOKだ。復旧に6日もかかってしまった。
  • 今回のようなことがか内容にと、今回はインストール時にLVMを使用する設定とした。ちなみに、ディスクのパスフレーズの強度を大幅に高めた。
  • だが、標準でLVにVG全域を使用してしまうため、「管理やバックアップを容易にするため」と言いながら、実際は全く柔軟性がない。仕方ないので、SystemRescueCDで起動し、luksOpenしてvgscanし、ルートボリュームをe2fsck+resizefs+e2fsckで縮小した後、lvreduce --size 80G ManjaroVG/ManjaroRootでOK。アップデート前にスナップショットを取るようにすればロールバックは容易になる。Manjaroでは運用中にこのような事態に陥ることが既に3回めなので必要だろう。また、rsyncでバックアップしておくことも必要かもしれない。