技術

Bash on Ubuntu on Windows on Ryzen でカーネルビルドにまれに失敗する件の再現手順

この記事に関連するかもしれない記事

ということで、とりあえず手順だけのっけておきます。
純粋により多くの人に試してみて欲しいなと思ったので書きました。(簡単ですし)

内容は雑ですが、ある程度PCに慣れている人なら迷わずに実行できるくらいにはキモをおさえたつもりなので是非。
多分1時間くらいあればビルド開始するところまで十分進めれるかと。

Windows 10 Creators UpdateのWSLを使う前提で説明してます。

手順

WSL(Bash on Ubuntu on Windows)のインストール

コントロールパネル → プログラム → Windowsの機能の有効化または無効化

Windows Subsystem for Linux(Beta)にチェックを入れて「OK」を押す。

すると多分再起動を求められるので再起動する。

再起動したらコマンドプロンプトを開き bash と入力してエンター。

そうすると多分開発者モードを有効にしろ的なメッセージが出るので
設定 → 更新とセキュリティ → 開発者向け

開発者モードを選択すると、1分くらい?何かインストールしています的なメッセージが出た後、開発者モードが有効になる。

そしたら、もう一回コマンドプロンプトから bash を起動し、メッセージに従って進めていくと Ubuntu on Windows がインストールされる。

終わったら、コルタナさんのところに bash と入力すると Bash on Ubuntu on Windows が出て来るのでそこから起動できる。

ビルド環境の用意(全てBash on Ubuntu on Windowでの作業)

Bash on Ubuntu on Windows のウインドウのタイトルバーを右クリックして出てくるコンテキストメニューから「プロパティ」をクリックし、「オプション」タブの「簡易編集モード」を有効にすると右クリックで Bash on Ubuntu on Windows にペーストできるようになります。

apt の利用リポジトリを日本(JAIST)のサーバーに変更(パッケージダウンロード時間の短縮のため)

sudo sed -i.bak -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list

linux のソース等をダウンロード可能にするためのリポジトリを追加

sudo su -c "grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"

リポジトリのデータベースを更新

sudo apt update -y

とりあえず既存のパッケージを更新

sudo apt upgrade -y

カーネルのビルドに必要なパッケージのインストール

sudo apt build-dep -y linux
sudo apt install -y libncurses5-dev

Creators Update 以前から Bash on Ubuntu on Windows を使っていた環境では apt build-dep が実行できないかもしれません。その場合はこちらの方法で WSL を再インストールすると解決できるかもしれません。(再インストールするともちろん WSL 内の環境が消えますので注意)

linux のソースコードを取得

cd
mkdir linux.ubuntu-16.04
cd linux.ubuntu-16.04
apt source linux
cd linux-4.4.0
chmod -R u+x debian/scripts/*
cp debian.master/changelog debian/

カーネルコンフィグ

make menuconfig

TUI(Text User Interface)が表示される。
こんな感じでちょっと崩れた感じで表示されるかも。

右矢印キーを1回押し、 Exit がハイライトしたらエンター。
そのまま Yes がハイライトされている状態でエンター。

無限ビルドスクリプトのダウンロード

wget -O do.sh https://gist.githubusercontent.com/satoru-takeuchi/23afbf565c2d97c3ef16e5d46d11f5bf/raw/f7098d66a6df3b118d8906aa08eafd2ef1b797ee/ryzen-problem-repro3

スクリプトの中身が下記と同じになってるか一応確認

#!/bin/bash

export LANG=C

if [ $# -ge 1 ] ; then
  CONCURRENCY=$1
else
  CONCURRENCY=16
fi

for ((i=0;1;i++)) ; do
  if make -j$CONCURRENCY >/dev/null 2>>log.txt ; then
    echo "$i: $(date): OK" >>log.txt
  else
    echo "$i: $(date): NG" >>log.txt
  fi
  dmesg >dmesg.txt
  make clean >/dev/null 2>>log.txt
done

※このスクリプトは satoru-takeuchi 氏が書いたのもです。
ryzen-problem-repro3 · GitHub

無限ビルドの実行

bash do.sh

確認

無限ビルド中の Bash on Ubuntu on Windows のウインドウを開いたまま、別の Bash on Ubuntu on Windows を起動し、このコマンドを実行。

tail -f -n 10000 linux.ubuntu-16.04/linux-4.4.0/log.txt | grep -e '^make' -e '^[0-9]\+:'

※ grep はコンパイラの警告などを取り除くために使ってます。
Bash on Ubuntu on Windows のタイトルバーを右クリックして出てくるコンテキストメニューの「プロパティ」から「レイアウト」タブの「画面バッファーのサイズ」の「高さ」を 9999 とかにしておくと出力が長くなってもスクロールバックして確認できます。

これであとは、ビルドが終わる度にビルド回数と日時と OK/NG が表示されます。

8コアRyzenならだいたい4分前後で1回のビルドが終わるようです。

うちの場合は、最初に実行したときは30回を待たずして2回 NG が出ましたが、次に実行したときは93回目にしてやっと NG が出る、という感じで再現頻度はかなりランダムな感じです。
特に2回目の実行のときは371回まで回しましたが、途中200回以上(時間にして約14時間もの間) NG が出ないという事もありましたので、運が悪い(良い?)と数百回まわしても再現しないという事もあるかもしれません。

私のスタンス的にはRyzenに問題があると主張したいわけではなく「正直良くわからない」という感じです。
Windows 10 Creators Update も WSL もまだ全然枯れていないソフトウェアですし、Ryzen以外のハードウェアの問題かもしれませんしね。
また、恥ずかしながら低レイヤを深く調査するスキルもないですし。

さらに言うと、WSLでビルドに失敗する件が、話題の実行命令64バイトズレ問題や実際のLinuxのgcc等でSEGVする問題との関係があるのかも私にはよく分からないです。

ただ、このままだと本格的に実戦投入するのは怖いので(軽めの用途で半分くらいは実戦投入してるんですが)何らかの形で解決して、少しでも早くRyzenライフをエンジョイできればいいなと思っています。

追記
[WARNING] Intel Skylake/Kaby Lake processors: broken hyper-threading という話が出てきました。
IntelのSkylake世代のCPUとKabylake世代のCPUにHT(ハイパースレッディング)関係の問題があって、HT有効だとOS問わずデータ破壊の可能性があるという話です。
盛り上がってまいりました!

さらに追記
Intelの件の日本語の記事が出ました。
Skylake/Kaby Lakeでシステムクラッシュを引き起こすエラッタが発見。BIOS更新が必要 – PC Watch
BIOSアップデートで修正されるみたいですね。
AMDのほうも、もし原因の一端がCPUにあるのであれば、このくらいの説明は欲しいところです。

参考

Tech TIPS:Windows 10のBash on Ubuntu on Windows環境を初期化/再インストールする – @IT
apt-getの利用リポジトリを日本サーバーに変更する – Qiita
Ubuntu 16.04: apt sourceでソースコードをダウンロードする – Narrow Escape
Ubuntu 16.04でカーネルを再ビルドする – Narrow Escape
ryzen-problem-repro3 · GitHub
Ryzenにまつわる2つの問題 – 覚書
日記 (2017 年 6 月下旬)

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください