技術者になりたい何か

技術者になりたい何かの覚書的な何かです

てきすとすとりーむ1

テキスト処理系コマンドその1

テキストデータを見たり加工したりするための色々。
組み合わせて使うとなんだか色々できる。

cat

ファイルの中身を表示する。
主なオプション
-n 各行の左端に行番号を付ける。

リダイレクトでつなぐと二つのファイルを一つにまとめたりできる。

$ ls
greptes greptes~ testtest yum.log yum.log-20160101
$ cat yum.log yum.log-20160101 > yum2.log
$ ls
greptes greptes~ testtest yum.log yum.log-20160101 yum2.log

head

ファイルの先頭部分表示。
デフォルトでは10行。

主なオプション

-n 行数 先頭から指定された行数表示
-c バイト数 出力するバイト数指定

$ head -n 2 /var/log/pacman.log
[2017-07-24 05:55] [PACMAN] Running 'pacman -r /mnt/ -Sy --cachedir=/mnt//var/cache/pacman/pkg --noconfirm base base-devel dosfstools openssh ccache emacs'
[2017-07-24 05:55] [PACMAN] synchronizing package lists

$ head -c 16 /var/log/pacman.log
[2017-07-24 05:5

 

tail

ファイルの末尾表示。デフォルトで10行。

おもなオプション
-n 行数 指定した行数表示
-c バイト数 指定したバイト数表示
-f ファイルの末尾に追加された行を表示し続ける

tailコマンドで特筆すべきは-fオプション。
ファイルの末尾に追加された行を表示し続けるため、リアルタイムでログを見ながら何かの作業をするときなどによく使う。

$ sudo tail -f /var/log/nginx/error.log
2017/08/16 08:39:56 [notice] 5174#5174: exiting
2017/08/16 08:39:56 [notice] 5173#5173: signal 17 (SIGCHLD) received
2017/08/16 08:39:56 [notice] 5173#5173: worker process 5174 exited with code 0
2017/08/16 08:39:56 [notice] 5173#5173: exit
2017/08/17 00:33:24 [notice] 8726#8726: using the "epoll" event method
2017/08/17 00:33:24 [notice] 8726#8726: nginx/1.12.1
2017/08/17 00:33:24 [notice] 8726#8726: OS: Linux 4.12.5-1-zen
2017/08/17 00:33:24 [notice] 8726#8726: getrlimit(RLIMIT_NOFILE): 1024:4096
2017/08/17 00:33:24 [notice] 8727#8727: start worker processes
2017/08/17 00:33:24 [notice] 8727#8727: start worker process 8728

こんな感じでリアルタイムでエラーログ見ながら修正してくときとかに便利。

nl

主なオプション

-b 形式 指定した形式で本文に行番号を付与する
-h 形式 指定した形式でヘッダに行番号を付与
-f 形式 指定した形式でフッタに行番号を付与

a すべての行
t 空白以外の行
n 行番号の付与を中止

ヘッダとかフッタとかよくわからないけどこういうことらしい。

\:\:\: ヘッダー
\:\: 本文
\: フッター

実行例

$ cat sample
\:\:\:
Header
\:\:
Ubuntu
CentOS
Fedora
\:
Footer

$ nl sample

Header

1 Ubuntu
2 CentOS
3 Fedora

Footer
nl -ha sample

1 Header

2 Ubuntu
3 CentOS
4 Fedora

Footer
$ nl -fa sample

Header

1 Ubuntu
2 CentOS
3 Fedora

4 Footer
$ nl -ba sample

Header

1 Ubuntu
2 CentOS
3 Fedora

Footer

 

使う場面があまり思い浮かばない。。。

od

主なオプション

-t 出力するフォーマットを指定する

出力タイプ
c ASCII文字
o 8進数
x 16進数

$ od sample
0000000 035134 035134 035134 044012 060545 062544 005162 035134
0000020 035134 052412 072542 072156 005165 062503 072156 051517
0000040 043012 062145 071157 005141 035134 043012 067557 062564
0000060 000162
0000061
$ od -t x sample
0000000 3a5c3a5c 480a3a5c 65646165 3a5c0a72
0000020 550a3a5c 746e7562 65430a75 534f746e
0000040 6465460a 0a61726f 460a3a5c 65746f6f
0000060 00000072
0000061
$ od -t c sample
0000000 \ : \ : \ : \n H e a d e r \n \ :
0000020 \ : \n U b u n t u \n C e n t O S
0000040 \n F e d o r a \n \ : \n F o o t e
0000060 r
0000061

これも使う場面があまり・・・プログラマな人とかは使うのかな?


cut

ファイルの各行から指定したフィールドを取り出す。

主なオプション
-c 文字数 取り出す文字位置を指定する
-d 区切り文字 フィールドの区切り文字を指定する(デフォルトはタブ)
-f フィールド 取り出すフィールドを指定する

$ cat yum.log
Aug 09 21:33:12 Updated: libgcc-4.4.7-16.el6.x86_64
Aug 09 21:33:13 Updated: dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 21:33:13 Updated: tzdata-java-2015g-2.el6.noarch
Aug 09 21:33:13 Updated: libX11-common-1.6.0-6.el6.noarch
Aug 09 21:33:13 Updated: centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 21:33:15 Updated: kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 21:33:15 Updated: ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 21:33:16 Updated: xkeyboard-config-2.11-3.el6.noarch
Aug 09 21:33:16 Updated: xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 21:33:16 Updated: tzdata-2015g-2.el6.noarch
Aug 09 21:33:23 Updated: glibc-common-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:23 Updated: nss-softokn-freebl-3.14.3-23.el6_7.x86_64
Aug 09 21:33:27 Updated: glibc-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:27 Updated: ncurses-libs-5.7-4.20090207.el6.x86_64
Aug 09 21:33:27 Updated: bash-4.1.2-33.el6_7.1.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
(以下略)

$ cut -c 5-6 yum.log
09
09
09
09
09
09
09

上記の場合日付の部分(5文字から6文字目)を取り出してる

-dでは区切り文字はデフォルトでタブ。一文字空白を区切りとして使うには" " もしくは' 'をつかうとよい。
(シングルorダブルクオーテーションで半角スペースを指定)
上記yum.logではフィールドの区切りが半角スペースなので、普通に-fだけでフィールド指定してもうまく取り出せない。
(区切りが無いとみなされるのですべて表示される?)

$ cut -d ' ' -f 3 yum.log
21:33:12
21:33:13
21:33:13
21:33:13
21:33:13
21:33:15
21:33:15
21:33:16
21:33:16

日付とパッケージ名を合わせて出したいときは一文字スペースを区切りとして、1,2,5番目のフィールドをそれぞれ取り出せばよいので

$ cut -d ' ' -f 1,2,5 yum.log
Aug 09 libgcc-4.4.7-16.el6.x86_64
Aug 09 dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 tzdata-java-2015g-2.el6.noarch
Aug 09 libX11-common-1.6.0-6.el6.noarch
Aug 09 centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 xkeyboard-config-2.11-3.el6.noarch
Aug 09 xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 tzdata-2015g-2.el6.noarch

join

2つのファイルを読み込んで、それぞれの指定したフィールドが共通する行を結合する。
どちらのファイルもあらかじめ、joinで指定するフィールドでソートしておく必要がある。
エクセルとかMySQLのあんな感じを想像すると幸せな使い方が浮かびそう。

主なオプション
-j 連結するフィールドを指定する

join1 join2 の2つのファイルを一つ目のフィールドで連結する。

$ cat join1
Debian a
CentOS b
Arch c
Mint a
Ubuntu a
Fedra b

$ cat join2
Debian apt
CentOS yum
Arch pacman
Mint apt
Ubuntu apt
Fedra yum

 

$ join -j 1 join1 join2
Debian a apt
CentOS b yum
Arch c pacman
Mint a apt
Ubuntu a apt
Fedra b yum


paste

一致する行を水平方向に連結。連結時の区切り文字はデフォルトでタブ。

オプション
-d 区切り文字

さっきのファイルで実行。区切り文字を:とする。

$ paste -d ':' join1 join2
Debian a:Debian apt
CentOS b:CentOS yum
Arch c:Arch pacman
Mint a:Mint apt
Ubuntu a:Ubuntu apt
Fedra b:Fedra yum
:

tr

標準入力から読み込まれた文字列を変換とか削除とかする。

主なオプション
-d 「文字列1」でマッチした文字列を削除する。
-s 連続するパターン文字列を1文字として処理する。

クラス
[:alpha:] 英字
[:lower:] 英小文字
[:upper:] 英大文字
[:digit:] 数字
[:alnum:] 英数字
[:space:] スペース

sampleの中の英小文字を全て英大文字に変えて出力。

$ cat sample
\:\:\:
Header
\:\:
Ubuntu
CentOS
Fedora
\:
$ cat sample | tr 'a-z' 'A-Z'
\:\:\:
HEADER
\:\:
UBUNTU
CENTOS
FEDORA
\:

クラスを使って同じことをする

$ cat sample | tr [:lower:] [:upper:]
\:\:\:
HEADER
\:\:
UBUNTU
CENTOS
FEDORA
\:

\:を削除
削除するのが\なので囲ってエスケープ

$ tr -d '\\:' < sample

Header

Ubuntu
CentOS
Fedora

 

split

指定サイズでファイルを分割。
デフォルトでは1000行毎。
分割されたファイルには末尾にaa ab acがつく。

オプション
- 行数

yum.logを100行毎に分割。分割後のファイルはyumXX

$ ls
join1 join2 sample testtest yum.log yum.log-20160101 yum2.log
$ split -100 yum.log yum
$ ls
join2 testtest yum.log-20160101 yumaa yumac yumae
greptes join1 sample yum.log yum2.log yumab yumad yumaf

sort

行単位でファイル内容をソートする。
デフォルトでは昇順。

主なオプション
-b 行頭の空白無視
-f 大文字小文字の区別無視
-r 降順にソート
-n 数字を文字ではなく数値として処理
-k 列番号 指定した列の値でソート

使用例
yumaaの中で、時間よりもUpdateかInstalledかで比べたい。ので4番目の列でソートする。

$ cat yumaa
Aug 09 21:33:12 Updated: libgcc-4.4.7-16.el6.x86_64
Aug 09 21:33:13 Updated: dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 21:33:13 Updated: tzdata-java-2015g-2.el6.noarch
Aug 09 21:33:13 Updated: libX11-common-1.6.0-6.el6.noarch
Aug 09 21:33:13 Updated: centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 21:33:15 Updated: kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 21:33:15 Updated: ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 21:33:16 Updated: xkeyboard-config-2.11-3.el6.noarch
Aug 09 21:33:16 Updated: xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 21:33:16 Updated: tzdata-2015g-2.el6.noarch
Aug 09 21:33:23 Updated: glibc-common-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:23 Updated: nss-softokn-freebl-3.14.3-23.el6_7.x86_64
Aug 09 21:33:27 Updated: glibc-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:27 Updated: ncurses-libs-5.7-4.20090207.el6.x86_64
Aug 09 21:33:27 Updated: bash-4.1.2-33.el6_7.1.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: chkconfig-1.3.49.3-5.el6.x86_64
Aug 09 21:33:27 Updated: libstdc++-4.4.7-16.el6.x86_64
Aug 09 21:33:28 Updated: libcom_err-1.41.12-22.el6.x86_64
Aug 09 21:33:28 Updated: freetype-2.3.11-15.el6_6.1.x86_64
Aug 09 21:33:28 Updated: krb5-libs-1.10.3-42.el6.x86_64
Aug 09 21:33:28 Updated: libxml2-2.7.6-20.el6_7.1.x86_64
Aug 09 21:33:28 Updated: nspr-4.10.8-2.el6_7.x86_64
Aug 09 21:33:28 Updated: db4-4.7.25-20.el6_7.x86_64
Aug 09 21:33:28 Updated: nss-util-3.19.1-2.el6_7.x86_64
Aug 09 21:33:29 Updated: 2:shadow-utils-4.1.4.2-19.el6_6.1.x86_64
Aug 09 21:33:29 Updated: elfutils-libelf-0.161-3.el6.x86_64
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Updated: 2:libpng-1.2.49-2.el6_7.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:29 Updated: libudev-147-2.63.el6_7.1.x86_64
(以下省略)

$ sort -k 4 yumaa
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:41 Installed: libwmf-0.2.8.4-25.el6_7.x86_64
Aug 09 21:33:37 Updated: 14:libpcap-1.4.0-4.20130826git2dbcaa1.el6.x86_64
Aug 09 21:33:32 Updated: 1:cups-libs-1.4.2-72.el6.x86_64
Aug 09 21:33:29 Updated: 1:dbus-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
Aug 09 21:33:35 Updated: 1:perl-Compress-Raw-Zlib-2.021-141.el6_7.1.x86_64
(以下省略)

 

4番目で昇順、4番目の値が同じなら5番目を比べてソート。

$ sort -k 4,5 yumaa
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:41 Installed: libwmf-0.2.8.4-25.el6_7.x86_64
Aug 09 21:33:37 Updated: 14:libpcap-1.4.0-4.20130826git2dbcaa1.el6.x86_64
Aug 09 21:33:32 Updated: 1:cups-libs-1.4.2-72.el6.x86_64
Aug 09 21:33:29 Updated: 1:dbus-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
(以下省略)

Installed Updatedでソートされ、その中でパッケージ名をアルファベット順に並び替えてるのが分かる。

メイン機のLinuxをArchにしました

なぜArchにしたし

元々使ってたのはLMDEでした。
元PCにはHDD3台にそれぞれWindows10(Insider Preview),Windows Vista,LMDE(Linux Mint Debian Edition)という仕様。
ちなみにk10世代でしたし純BIOSです。

前記事でも少し触れましたがとうとうRyzenにしました。
さすがのAMDでもMBにもメモリにも互換性ないのでほぼ新規組立。
ちなみに旧PCは最近PC壊れたとか言ってた職場の後輩に格安で提供。
余談ですがうちの鯖機はAthlon64x2 4800+ & M2AVMという化石のような構成ですが安定稼働してます。
しばらくあけてないけどコンデンサ大丈夫でしょうかね。

で、Ryzen機にHDDそのままつないでLMDE動くかなーと思ったら動きませんでした。
BIOSUEFIなので当り前ですね。UEFIよくわかってないけど。
busyboxに落ちたりGUI起動にこけるならまだやる気も沸いたけど、完全に起動途中で止まってるので手の出しようが無さそう。
というわけでLMDE入れ直そうと考えました。

が、ここで問題発生。

gihyo.jp


2年ぶり?公式のブログとか見てもなんだかLMDEの情報少ないような気がします。
噂によるとRyzenに正式対応しているカーネルは4.10以降とかなんとか。新しいハード構成なので、色々と古いのは支障が出そうです。
じゃあDebianで・・・jassieではカーネル3.16 stertchでも4.9・・・

あとfglrxがなくなってamdgpu-proになった模様です。浦島な気分です。
AMDの公式配布のLinux用ドライバはCentOS/RHEL,Ubuntu,SLED/SLESです。なぜUbuntuはあってDebianはないのでしょうか。
ArchのWiki見てみたらamdgpu-proの導入方法があったし、AURにパッケージあるっぽかっのでこれはいけるかも
あとArchなら基本的にほぼ最新のカーネル降りてきます。

じゃあArchにしよう。ちょうどUSBも1GBのしかないですし。
(手持ちの8GBはWindows10のインストールメディアにしてしまって他のいくつかは行方不明です。
 しかも光学ドライブは付いてないです。旧PCに載っけたまま譲っちゃいました。

というわけでArch入れるよ

参考にしたところ

Arch LinuxをUEFI + GPT環境にインストールする

VMwareにArch Linuxをインストールしよう - Qiita

インストールガイド - ArchWiki

基本的な流れを把握したら、あとは順にやっていけば大丈夫です。基本的に。
パーティション → base インストール → chrootで最低限の設定 → bootloaderインストールって感じですね。
ここまでやったらHDDで起動自体はできるので、あとは好みに応じたGUI環境とか設定入れていけばよいです。

一応実機入れる前に仮想環境で何度か入れていたことが有りましたので、流れ自体は把握してたのでよかったです。
とはいえ使うコマンド全部覚えてたわけじゃないので調べながらでしたけど。

GUI環境+RX560用の色々を入れてみるよ

GUI環境はとりあえずmate。使い慣れたのがいいですね。
Xorg,Mate,LightDMあたりとその他適当に。

ここでamdgpu-proを入れてみる・・・

と思うじゃん。

AMDGPU - ArchWiki

「AMDGPU PRO を使うには linux (4.8 または 4.9) と Xorg (1.18) パッケージのダウングレードが必要になります。」

えーと、Ryzen対応のカーネルは4.10以降なんだけど、4.10以降のカーネルにはamdgpu-proは入れられない。
CPUかGPUかどっちかにしろって事ですねわかりません。

ダメもとでそのままamdgpu-pro突っ込んだら起動しなくなりました。
GUIが起動しないんじゃなくて、カーネルがPCIdevice見失ってる?っぽいメッセージが出て起動プロセスが止まります。
Recovery modeもダメだし、busyboxにも落ちないので何もできず。
入れ直し。

amdgpu-proは使えないけどもxf86-video-amdgpu+mesa-vdpau で結構快適です。
動画再生支援が聞いてるかは微妙ですが、不快な感じは無し。特に問題無く使えてます。
ベンチはしてない。

あとRyzen用の設定各種

sensorsにはit87が必要だった模様

普通に入れて設定してみたけどどーも温度とか拾ってくれません。というか拾っている項目が少なすぎます。

$ yaourt -S lm_sensors
$ sudo sensors-detect
$ sensors

どうもit87-driverが必要とかなんとか(MSIはnct6775とかなんとか
Ryzen Temperature Monitoring(Arch Forum)
https://bbs.archlinux.org/viewtopic.php?id=225370

$ yaourt -S it87-dkms-git
$ sudo modprobe it87
$ sudo sensors-detect
$ sensors
amdgpu-pci-2500
Adapter: PCI adapter
fan1: 1020 RPM
temp1: +39.0°C (crit = +0.0°C, hyst = +0.0°C)

it8655-isa-0290
Adapter: ISA adapter
in0: +0.42 V (min = +2.57 V, max = +2.34 V) ALARM
in1: +2.50 V (min = +2.32 V, max = +0.95 V) ALARM
in2: +2.03 V (min = +2.47 V, max = +1.23 V) ALARM
in3: +2.04 V (min = +1.91 V, max = +1.29 V) ALARM
in4: +2.04 V (min = +2.67 V, max = +0.72 V) ALARM
in5: +1.96 V (min = +2.69 V, max = +2.57 V) ALARM
in6: +2.04 V (min = +2.05 V, max = +1.62 V) ALARM
3VSB: +1.68 V (min = +2.41 V, max = +2.26 V) ALARM
Vbat: +1.65 V
+3.3V: +1.68 V
fan1: 1117 RPM (min = 16 RPM)
fan2: 505 RPM (min = 27 RPM)
fan3: 551 RPM (min = 20 RPM)
temp1: +39.0°C (low = -110.0°C, high = +59.0°C)
temp2: +35.0°C (low = -25.0°C, high = +87.0°C)
temp3: +41.0°C (low = -66.0°C, high = -33.0°C) ALARM sensor = thermistor
intrusion0: ALARM

asus-isa-0000
Adapter: ISA adapter
cpu_fan: 0 RPM

 

きましたね。in0がVcore?min,maxの数値がおかしいですが、取れてるので良しとします。

起動時にit87読んでくれるように/etc/modules-load.d/にit87用の設定ファイルを置きます。
it87.confを作成。中身はit87と書いておきます。

$ sudo emacs /etc/modules-load.d/it87.conf
it87

これで再起動時にも勝手に読んでくれるのでmodprobeしなくてもいきなりsensorsが使えるようになります。

Zenstatesで低電圧化orOC

ここにあるのでgitとかで取ってきます

github.com

modprobe msr してから -lつけて実行すると今のstatesが見れます。

ここから-f -d -vオプションでクロック、電圧の調整。
modprobe msr がめんどい人は上のit87みたいに/etc/modules-load.d/にmsrって書いたファイル突っ込んどけばよいです。

$ modprobe msr
$ sudo ZenStates-Linux/zenstates.py -h
usage: zenstates.py [-h] [-l] [-p {0,1,2,3,4,5,6,7}] [--enable] [--disable] [-f FID] [-d DID] [-v VID]

Sets P-States for Ryzen processors

optional arguments:
-h, --help show this help message and exit
-l, --list List all P-States
-p {0,1,2,3,4,5,6,7}, --pstate {0,1,2,3,4,5,6,7}
P-State to set
--enable Enable P-State
--disable Disable P-State
-f FID, --fid FID FID to set (in hex)
-d DID, --did DID DID to set (in hex)
-v VID, --vid VID VID to set (in hex)
--c6-enable Enable C-State C6
--c6-disable Disable C-State C6
$ sudo ./ZenStates-Linux/zenstates.py -l
P0 - Enabled - FID = 8C - DID = 8 - VID = 38 - Ratio = 35.00 - vCore = 1.20000
P1 - Enabled - FID = 78 - DID = 8 - VID = 58 - Ratio = 30.00 - vCore = 1.00000
P2 - Enabled - FID = 7C - DID = 10 - VID = 8A - Ratio = 15.50 - vCore = 0.68750
P3 - Disabled
P4 - Disabled
P5 - Disabled
P6 - Disabled
P7 - Disabled
C6 State - Package - Enabled
C6 State - Core - Enabled

 

うちの1500XはOCはWindows上で定格電圧では3.8G位までしか安定しないことが分かっています。
(軽いベンチはクリアできるけどprime95は30秒持たない)
Linux上では低電圧攻めてみましょうか。

hexだし基準値から-される計算だったりするのでめんどいですけど、出たばかりのCPUでこういったツールがあるのは珍しいかもしれない。

$ sudo ./ZenStates-Linux/zenstates.py -p 0 -v 38
$ sudo ./ZenStates-Linux/zenstates.py -p 1 -v 58
$ sudo ./ZenStates-Linux/zenstates.py -p 2 -v 8A

$ sudo ./ZenStates-Linux/zenstates.py -l
P0 - Enabled - FID = 8C - DID = 8 - VID = 38 - Ratio = 35.00 - vCore = 1.20000
P1 - Enabled - FID = 78 - DID = 8 - VID = 58 - Ratio = 30.00 - vCore = 1.00000
P2 - Enabled - FID = 7C - DID = 10 - VID = 8A - Ratio = 15.50 - vCore = 0.68750
P3 - Disabled
P4 - Disabled
P5 - Disabled
P6 - Disabled
P7 - Disabled
C6 State - Package - Enabled
C6 State - Core - Enabled

$ sensors
amdgpu-pci-2500
Adapter: PCI adapter
fan1: 1020 RPM
temp1: +39.0°C (crit = +0.0°C, hyst = +0.0°C)

it8655-isa-0290
Adapter: ISA adapter
in0: +0.42 V (min = +2.57 V, max = +2.34 V) ALARM
in1: +2.50 V (min = +2.32 V, max = +0.95 V) ALARM
in2: +2.03 V (min = +2.47 V, max = +1.23 V) ALARM
in3: +2.04 V (min = +1.91 V, max = +1.29 V) ALARM
in4: +2.04 V (min = +2.67 V, max = +0.72 V) ALARM
in5: +1.96 V (min = +2.69 V, max = +2.57 V) ALARM
in6: +2.04 V (min = +2.05 V, max = +1.62 V) ALARM
3VSB: +1.68 V (min = +2.41 V, max = +2.26 V) ALARM
Vbat: +1.65 V
+3.3V: +1.68 V
fan1: 1117 RPM (min = 16 RPM)
fan2: 505 RPM (min = 27 RPM)
fan3: 551 RPM (min = 20 RPM)
temp1: +39.0°C (low = -110.0°C, high = +59.0°C)
temp2: +35.0°C (low = -25.0°C, high = +87.0°C)
temp3: +41.0°C (low = -66.0°C, high = -33.0°C) ALARM sensor = thermistor
intrusion0: ALARM

asus-isa-0000
Adapter: ISA adapter
cpu_fan: 0 RPM

 

クロック落としたりすればもう少し攻められそうな気もしますが。


■感想

数年前にはインストールで躓いたけど割とスムーズに入れられました。
基本的に余計なものが入ってこなかったり、設定ファイル書き換えられたりっていうのが少なくて快適です。
自力感が味わえるかもしれないです。
新しいパッケージがガンガン降りてくるので、そういうのが好きな人には良いと思います。
ローリングリリースなので、一回入れてしまえば再インストールの手間はないです。壊さない限り。

「ディスプレイドライバが応答を停止しましたが、正常に回復しました」との戦いの顛末

久々にPC組んだらこれだよ・・・
というわけで2か月近くに及ぶ戦いに勝利したので書いときます。

先に結論


「ディスプレイドライバが応答を停止しましたが、正常に回復しました」の原因はメモリ。
メモリ自体が不良ってわけじゃなくて、俗にいう相性というやつの模様。
メモリ買い替えたら直りました。

構成

CPU:Ryzen5 1500X
メモリ:Corsair CMK8GX4M2A2666C16(Ver.5.30)
MB:ASUS B350-PLUS
グラボ:SAPPHIRE RX560
電源:玄人志向 KRPW-N600W
OS:Windows10 Pro

症状

BIOS POSTは正常。
Windows起動も正常。
ブラウジングの時にしばしばカーソルが反応しなくなる⇒数秒後に画面暗転⇒数秒後に勝手に復旧
  ⇒タスクトレイのメッセージに表題の「ディスプレイドライバが応答を停止しましたが、正常に回復しました」
  ⇒イベントビューアでは「ディスプレイ ドライバー amdkmdap が応答を停止しましたが、正常に回復しました。」
CINEBENCHGPUはほぼ完走できず。途中でホワイトアウト。⇒Windows自体は生きてるので、タスクマネージャとかからCINEBENCH強制終了はできる。
  発生確率は体感7割くらい。
FF14紅蓮のベンチは完走できず。「DirectXに致命的なエラーが」とかなんとか

頻度が結構なのと、まともにベンチ取れないのできつかった。

調査と戦い

軽く調べてみると・・・
Windows XP以降のどのWindowsでも起こる模様。
NVIDIA,AMD,ATIのどれでも起こる模様。
これやったらなおったよ、という記事はたくさんあるけど、みんなバラバラ。つまり原因不明、というか原因はバラバラ。

1.グラボが原因?


まぁグラボっぽいですよね。最初に疑いました。
このエラーがグラボ起因で出る時の原因は主に3つ。
・グラボの故障
・グラボの物理的接触不良(取り付けミス)
・ドライバがおかしい

自作erは故障を疑うのは最後です。
グラボ抜き差ししてみたけど症状変わらず。新品なので埃等による冷却性能低下などは考えにくいです。

次はドライバ。割と新製品なのでこれは疑わしい。
DDUを使って旧ドライバ完全削除して、AMDからの最新のドライバ(ベータと正式版の2種類)を試みる。

www.guru3d.com

 

結果変わらず。

2.BIOS


まぁ新しいですしね。Ryzen用MBはまだBIOS成熟しきってないという話もありますし。
ASUSのサイトから新しい方から3つくらい拾ってきます。
0613 Agesa1.0.0.6α
0609
0606 Agesa1.0.0.4α
あたり。他にも試した気がするけどもう忘れました。
結果は変わらず。

3.メモリ?
www.btopcinfo.com

www.btopcshop.com


まさかのメモリ?しかも相性?
とりあえず今回のメモリをD.O.C.P(XMPプロファイル)有効無効で症状の発生具合を調べてみるがあまり変わらない。
ちなみにこの辺でmemtest走らせてみるけど問題無く2passくらい。
⇒メモリの「不具合」ではないし、2666稼働が厳しいわけでもなさそう。

とはいえグラボ・BIOSの線はほぼ消えてるので、メモリはもうちょい検証してみました。
というわけで基本の2枚刺し⇒1枚刺しすると・・・
嘘のように症状が消えます。
すると問題はメモリの相性orメモリスロット。
A2-B2に刺してたのをA1-B1にしてみる→症状発生
A1-A2に刺してみる→症状発生
B1-B2に刺してみる→症状発生

A1のみ1枚→症状発生せず
B1のみ1枚→症状発生せず
A2のみ1枚→症状発生せず
B2のみ1枚→症状発生せず

どうもデュアルチャネル関係なしに、2枚さすのはダメな模様ですね。
この間2133,2666で試す、2枚のメモリの組み合わせを変えてみる等々しているので、
実際に試した組み合わせは詳しく覚えていません。
ただ、2枚刺しではほぼ必ず症状発生。1枚では症状発生せず。
また、2枚のメモリのどちらか1枚が原因という事も無さげです。

ここが上記BTO高知さんの状況と違うところ。2枚の内どちらかで症状発生ならメモリ確定とするところですが、
2枚とも1枚刺しでは正常稼働を確認しているため、確実にメモリとは言い切れません。

この時点で可能性としては
・メモリの相性(2枚だとダメ)
・MBの不具合(でも特定のメモリスロットがダメというのではない)
・CPUのメモコン

あと、非常に低い可能性としてグラボの初期不良・電源の初期不良が有ります。
電源は容量的には十分なはずなので、高負荷時に供給が不安定になっていると・・・ってことですね。
まぁ、この辺の可能性はかなり低いでしょう。全てを試してダメなら・・・という感じです。


それからどうした

ドスパラの通販でまとめて購入したので、サポートに聞いてみた。
状況説明して、相性、MB不具合、CPUのメモコン不具合のどれかだと思うけど・・・と。
メルマガ会員になってたので初期不良1ヶ月以内です。
サポートの人曰く、「MBの不具合の可能性が高いので、CPU,MB,メモリを送ってくれないか」とのこと。
ついでにグラボも見てくれると言うので、CPU,MB,メモリ,グラボを送って調べてもらいました。
ちなみに集荷の手配はドスパラでやってくれて、配送料は無料です。

5日後くらい
電話かかってきて、「MBにIOエラー有、他のパーツは正常を確認。MBを初期不良として新品交換します」とのこと。

なおったか

と思って組んでみたけど症状再発。MB2連続初期不良ってあんまり考えられない。なくはないけど。

ちなみにCorsairのメモリはVer.5系はHynix。Ryzenと相性悪いです。
というわけで、しばらく一枚刺しで稼働しながらメモリを物色しました。
3400以上だとRyzen環境では最高のパフォーマンスを発揮するSamsungのB-dieものの確率が上がるようですが、
3000以下ではおみくじです。G.SkillすらHynixが混じってる。
しかも迷ってる間にもメモリ価格は高騰。一時期噂になった(?)Samsungの純正バルクB-dieもほとんど残っていません。
そしてB350-PLUSのQVLに載ってるメモリはことごとく売り切れて入荷待ちになっていく。

それからどーした

そこで見つけたのは安定のMicron(のチップを確定で使ってるCrusial)。
安定と言っても、まぁ普通じゃない?という感じですけど。
Ryzen環境では
Samsung B-die>超えれらえない壁>>>>>>>>>Samsung B-die以外>>Micron>>>>>>>>>>Hynix
という感じでしょうか。結構今回の件での偏見が入ってるかもしれませんが。

というわけで候補はCrusial by MicronのBME or BMTあたりになりました。
よくよく調べてみるとどうやら
BME Eliteシリーズ→海外でBLEhogehoge
BMT Tacticalシリーズ→海外でBLThogehogeのようです。たぶん。
もう一つSportsシリーズ(BMS)→海外でBLSってのがありますが、どうもあまり売ってないので無視します。

BLT4Gとすれば、2666が2666で動いたとQVLのリストに載っています。だからといって動くとは限りませんが。
3000は載ってませんでしたが、Agesa1.0.0.6にかけて3000BMTにしました。
3000として動かなくても2枚刺しで安定してくれれば良しとします。(ドスパラで特価だった)


そうしてどーなった

結局W4U3000BMT(4Gx2)にしたわけですが、刺しなおして一発で2933起動。
今回の発端となった「ディスプレイドライバが応答を停止しましたが、正常に回復しました」は
換装して1週間ちょいですが、まだ一回も発症しておりません。
こけまくったベンチもすべて安定して完走。3DMarkもエラーなく走り切りました。

あ、ちなみに調子のって3200起動しようとしましたがダメでしたね。タイミング緩めれば行けるかもしれませんが、この辺がMicronチップの限界と言われればそーなのかなと思います。

結局最初に組んでから完全解決までに2か月近くかかってしまった。

 

ながれ

6/15一式購入

6/18完成

6/19戦闘開始

7/3メモリが原因っぽいのをつきとめる

7/13サポートから戻ってきて復活・・・したと思った

7/17再発して電源プランを疑う

7/31Radeonのドライバ更新の望みをかけるも打ち砕かれる

8/7やっとこさメモリ決める

8/9メモリ換装して戦い終了の予感

そーいうことでしたね


こうして見てみると買い替えのメモリ迷ってた期間長すぎだろ。いや、メモリ今高いですしね。。。

まとめ


・「ディスプレイドライバが応答を停止しましたが、正常に回復しました」の原因はメモリであることも有る。(確率は知らない)
・memtest問題無いメモリでも発症する
・Corsairのメモリはおみくじ