Windows10更新したら画面真っ黒になってgrub rescueが出た

Windows10を更新したらgrubで起動しなくなった件。なんかよくわからんが、Windowsが勝手にパーティション切ったらしい。

grub rescue出現

自作PCはUbuntuとWindows10のデュアルブートで、今回Windows10を起動しようとしたらログイン前に更新し始めたので待った。この更新は結構長かったので、Anniversary Updateというやつだったのかもしれない。とにかくこの更新中に何回か再起動するのだが、再起動するとブートローダのgrubがおかしくなっていた。いつもは紫色の画面(Ubuntuで入れたから)になって起動するOSを選択させてくれるのに、真っ黒な画面でgrub rescue>という味も素っ気もないプロンプトを出すようになった。exitquitshutdownも、補完すら利かないパンクなシェル。

起動方法(その場しのぎ)

grubのシェルはほとんどいじったことがない(いじりたくない)ので焦った。調べるとWindows10の更新でこうなる人は多いようで、情報はそれなりにあった。ありがたい。
結局対処法は簡単で

ls

とやって出たパーティションたちのどれにbootがあるか、一つ一つ調べていけばいい。例えば(hd0,msdos3)がbootを持つか調べたいときは

ls (hd0,msdos3)/boot

みたいな感じだ。これでなにやらごちゃごちゃ出るものがbootのあるパーティション。補完ができないので面倒なこと甚だしいが、やるしかない。
(ただし、人によってはこのコマンドで何も出てこないこともあるようだ。そのときはLiveUSBとか作ってLinuxを起動して調べないといけないっぽい。)

さてbootのあるパーティション(ここでは(hd0,msdos3)とする)が見つかったら、grubがそこを見るようにすればいい。これはsetというコマンドがあり、引数なしで入力すると現在の値が見れる。今回大事なのはprefixで

set prefix=(hd0,msdos3)/boot/grub

のようにして設定できる。これでgrubに正しいブート位置を教えることができた。あとは

insmod normal
normal

と打って、grubをノーマルモードにする。これでいつものgrubの画面に戻る。そしてOS選択して、ちゃんと起動できるようになる。

修正方法

上の方法でやっても、次回起動時にはまた同じことが起きる。setしてもgrubの設定はその1回限り変わるだけだからだ。設定を恒久的に変えるにはgrubの設定ファイルを更新し、インストールし直さないといけない。grubの設定ファイルは/boot/grub/grub.cfgで、たしかにファイル内にはhd0がどうこうという部分があり、ここでbootを指定しているようだ。だがファイルの冒頭に”DO NOT EDIT THIS FILE”と素敵なことが書いてある。このファイルは直接編集するものではなく、/etc/default/grubから生成するものだからだ。実は今回は何も編集しなくていい。

# update-grub

とすれば勝手にbootがどこにあるか探して、/boot/grub/grub.cfgを適切に変更してくれる。あとは

# grub-install /dev/sda

でその設定が反映される。/dev/sdaのところはブートローダを入れたいストレージを入れる。(lsblkとかgpartedとかで調べられる。)

なお、update-grubがないディストリビューションもある。そもそもupdate-grubは特別なものではなく、

$ cat $(which update-grub)

とすれば

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

となり、grub-mkconfigしているだけだとわかる。なのでそうすればいいんじゃないかな……実際に試してないのでよくわからん。

参考

windows10アップデートでデュアルブートマシンが起動不能になった話
boot – Windows 10 upgrade lead into grub rescue – Ask Ubuntu

XPS13 (9343)にArchLinuxをインストールする –ISOイメージ作成編–

2015年の春に買ったNew XPS13 (9343)(もうNewでも何でもない)にWindows10をクリーンインストールした。そのときついでにArchLinuxをインストールし直したので、そのときのメモ。
作業直後に書くつもりだったが大分時間が経ってしまったため、怪しいところがあるかもしれない。
本当はインストール作業まで全部書く予定だったが、力尽きたので続きはまたいつか書く。

要点

  • 通常のArchLinuxのISOイメージにはXPS13用の無線LANアダプタのドライバが入ってないので、このISOではインストールが難しい
  • 必要なドライバは broadcom-wl-dkms
  • ArchLinuxのISOイメージは Archiso でカスタマイズできる

ArchLinuxをインストールしたPCを用意する

何を言っているのかわからないかもしれないが、XPS13にArchLinuxをインストールするためには、ArchLinuxをインストールしたPCが必要。なぜなら通常のArchLinuxのISOイメージにはXPS13の無線LANのドライバが入っていないため(ここ参照)、そのままインストールしようとしてもネットに接続できず詰む。 broadcom-wl-dkmsというドライバを含むようカスタマイズしたISOイメージを作る作業をしなければならない。
ただし、XPS13の内蔵無線LANアダプタを使わずに、たとえばUSB接続の有線LANアダプタを使う場合などはこの作業は必要ないはず。そのときもドライバなかったら詰む。
なお、PCを別に用意しなくとも、XPS13のWindowsでArchLinuxの仮想マシンを作って以下の作業をしてもいい。

ArchLinuxのISOイメージを作成する

普通はArchLinuxのダウンロードサイト一覧からISOイメージを持ってきて、USBメモリに dd すればいい。
そのはずなのにドライバが足りてないため、以下のようになる。ここに感謝。

  1. Archisoの環境作り

    これはArchLinuxのISOイメージを自作するためのツール。以下では ~/archlive 以下に作業ディレクトリを作ることにする。

    sudo pacman -S archiso
    mkdir ~/archlive
    sudo cp -r /usr/share/archiso/configs/releng ~/archlive
    cd ~/archlive/releng
    
  2. yaourtを使うための設定

    broadcom-wl-dkmsはAURというリポジトリにある。AURにあるパッケージはyaourtというツールを使うと操作しやすい。

    まず ~/archlive/releng/pacman.conf の最後に以下を追記して archlinuxfr リポジトリを使えるようにする。

    [archlinuxfr]
    SigLevel = Never
    Server = http://repo.archlinux.fr/$arch
    

    そして ~/archlive/releng/package.both の最後に以下を追記。

    yaourt
    
  3. broadcom-wl-dkms のための設定

    上で編集した ~/archlive/releng/package.both にさらに以下を追記。これでbroadcom-wl-dkmsをビルドする環境が整う。

    linux-headers
    dkms
    fakeroot
    

    さてここから詰まった。2015年にArchlinuxを入れたときは ~/archlive/releng/airootfs/root/customize_airootfs.sh

    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    を追記すれば問題なくビルドできた(…はず)。これをする理由は、yaourtはrootでは実行できないため。sudoでarchというユーザに切り替えてyaourtを実行し、broadcom-wl-dkmsをインストールしているわけ。ところがなぜか今回はarchというユーザがいなくなっていたようだ。
    仕方ないので、あまりうまくないやり方だが他に思いつかないので次のようにやる。 ~/archlive/releng/airootfs/root/customize_airootfs.sh の最後に追記する内容を以下のように変える。

    useradd arch # archユーザを追加
    echo "root:hoge" | chpasswd # こうすればrootのパスワードをhogeに変えられる
    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    ここではarchというユーザを追加したが、既にシステムに存在するユーザでないなら何でもいい。パスワードを上のように切り替える方法はここで知った。

  4. ビルド

    cd ~/archlive/releng
    sudo ./build.sh -v
    

    ビルドの際にrootのパスワードを聞かれるので、上で設定した通りhogeと入れる。そうすれば実行ユーザが一般ユーザarchに切り替わり、yaourtが進む。

    1回のビルドでうまくいかずやり直すときは

    sudo rm -v ~/archlive/releng/work/build_make_*
    

    でリセットしてからまたビルドする。

    ビルドすればISOイメージが ~/archlive/releng/out/ 下にできているはず。

  5. USBメモリにISOイメージを書き込む

    ここに書いてある通り。
    lsblk でデバイス一覧が見れるので、どのデバイスファイルがUSBメモリなのかを 注意深く確認するここで不適切なデバイスファイルを指定すると重要なデータを意図せず消してしまう恐れがあるので気を付ける 。 もしマウントしているようなら umount でアンマウントしておく。
    /dev/sdx がUSBメモリだとして

    sudo dd bs=4M if=~/archlive/releng/out/archlinux-2016.09.11-dual.iso of=/dev/sdx
    

    のようにやればいい。ファイル名は例。

参考

PCを組み立てた

会社を辞めたのでPCを組むことにした。

自作PCはこれが初めて。ちょっとした夢だった。デスクトップPCを自宅で使うこと自体、10年以上なくなっている。CPUがSkylake、メモリがDDR4に切り替わり、しかも円高になっているので時期は良い…はず。

構成

でかくなってしまうが、初心者なのでATXで組んでみる。
ディスプレイとかキーボードはあとで調達。

一覧

組み立て

2時間くらいでサクッと終わらせるつもりが6時間くらいかかった。

まずCPUファンの設置で手こずった。ファンの台みたいなものをマザーボードの裏に取り付けたりして、とにかく大掛かり。

CPUfan

一通り組み立てたあとも、メモリを正常に認識しなくてやり直したり(はめ込み不足だったよう)、マザーボードが少しぐらつくのでやり直したり(これはやり直しても変わらなかった)で大変。

最悪だったのは全部出来上がってHDMIを繋ごうとしたら挿さらなかったこと。
HDMI端子のアダプタをよく見ると、なんか金具がひっかかっている。これが邪魔をして挿さらない。マザーボードを取り付けるときにI/Oパネルのツメ状の金具をひっかけてしまっていたようだ。最後にこんな罠が潜んでいたとは。

HDMI端子

これを直すためにまた配線したのを全部抜いてマザーボードを外さなければならず、面倒だった。

UnixBench

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: Z170-Ubuntu: GNU/Linux
   OS: GNU/Linux -- 4.4.0-31-generic -- #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz (7008.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz (7008.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz (7008.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz (7008.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   20:15:13 up 19 min,  1 user,  load average: 0.39, 0.43, 0.31; runlevel 2016-08-07

------------------------------------------------------------------------
Benchmark Run: 日  8月 07 2016 20:15:13 - 20:44:13
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       46345081.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3963.2 MWIPS (13.9 s, 7 samples)
Execl Throughput                               1231.3 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1514747.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          417070.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       3232154.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2928488.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 260112.7 lps   (10.0 s, 7 samples)
Process Creation                              15447.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5846.0 lpm   (60.2 s, 2 samples)
Shell Scripts (8 concurrent)                   4249.4 lpm   (60.2 s, 2 samples)
System Call Overhead                        5180488.0 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   46345081.0   3971.3
Double-Precision Whetstone                       55.0       3963.2    720.6
Execl Throughput                                 43.0       1231.3    286.4
File Copy 1024 bufsize 2000 maxblocks          3960.0    1514747.4   3825.1
File Copy 256 bufsize 500 maxblocks            1655.0     417070.3   2520.1
File Copy 4096 bufsize 8000 maxblocks          5800.0    3232154.3   5572.7
Pipe Throughput                               12440.0    2928488.3   2354.1
Pipe-based Context Switching                   4000.0     260112.7    650.3
Process Creation                                126.0      15447.0   1226.0
Shell Scripts (1 concurrent)                     42.4       5846.0   1378.8
Shell Scripts (8 concurrent)                      6.0       4249.4   7082.4
System Call Overhead                          15000.0    5180488.0   3453.7
                                                                   ========
System Benchmarks Index Score                                        1936.8

------------------------------------------------------------------------
Benchmark Run: 日  8月 07 2016 20:44:13 - 21:12:58
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables      171619985.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    16675.9 MWIPS (12.3 s, 7 samples)
Execl Throughput                              25236.7 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1604462.7 KBps  (30.1 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          427561.4 KBps  (30.1 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4511417.7 KBps  (30.2 s, 2 samples)
Pipe Throughput                            10792067.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                1853484.0 lps   (10.0 s, 7 samples)
Process Creation                              74028.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  45994.7 lpm   (60.2 s, 2 samples)
Shell Scripts (8 concurrent)                   5416.5 lpm   (60.2 s, 2 samples)
System Call Overhead                       10648058.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  171619985.4  14706.1
Double-Precision Whetstone                       55.0      16675.9   3032.0
Execl Throughput                                 43.0      25236.7   5869.0
File Copy 1024 bufsize 2000 maxblocks          3960.0    1604462.7   4051.7
File Copy 256 bufsize 500 maxblocks            1655.0     427561.4   2583.5
File Copy 4096 bufsize 8000 maxblocks          5800.0    4511417.7   7778.3
Pipe Throughput                               12440.0   10792067.3   8675.3
Pipe-based Context Switching                   4000.0    1853484.0   4633.7
Process Creation                                126.0      74028.8   5875.3
Shell Scripts (1 concurrent)                     42.4      45994.7  10847.8
Shell Scripts (8 concurrent)                      6.0       5416.5   9027.4
System Call Overhead                          15000.0   10648058.1   7098.7
                                                                   ========
System Benchmarks Index Score                                        6241.9

感想

静電気とか力の入れすぎとかで数万のパーツをパアにするといった恐れていた事態にはならず、ほっとした。でもやっぱり大変。性能的にはさすがにノートPCなんか比べ物にならないくらい良いのでこれからが楽しみ。