labunix's blog

labunixのラボUnix

「rtl_nic/rtl8168d-1.fw」の異常に対処する。

■「rtl_nic/rtl8168d-1.fw」の異常に対処する。

$ lsb_release -d
Description:	Debian GNU/Linux 9.5 (stretch)

■sshfsを使用していて、ファイルの読み込みが一時的に失敗することがあったので調べてみた。

$ sudo dmesg | grep fail
[    0.302533] acpi PNP0A08:00: _OSC failed (AE_SUPPORT); disabling ASPM
[    0.338227] ACPI: \: failed to evaluate _DSM (0x1001)
[   23.101631] r8169 0000:02:00.0: firmware: failed to load rtl_nic/rtl8168d-1.fw (-2)
[   23.101656] r8169 0000:02:00.0: Direct firmware load for rtl_nic/rtl8168d-1.fw failed with error -2

$ sudo dmesg | grep rtl
[   23.101631] r8169 0000:02:00.0: firmware: failed to load rtl_nic/rtl8168d-1.fw (-2)
[   23.101656] r8169 0000:02:00.0: Direct firmware load for rtl_nic/rtl8168d-1.fw failed with error -2
[   23.101662] r8169 0000:02:00.0 enp2s0: unable to load firmware patch rtl_nic/rtl8168d-1.fw (-2)

■NICドライバの不具合の疑いがあるが、non-freeは組み込まれている。

 Debian stretch failed to load firmware rtl_nic/rtl8168g-3.fw (-2)
 https://unix.stackexchange.com/questions/384403/debian-stretch-failed-to-load-firmware-rtl-nic-rtl8168g-3-fw-2

$ grep ^deb.*non-free /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ stretch main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ stretch main contrib non-free
deb http://deb-multimedia.org stretch main non-free

■タイミングとしては10/27のinitrdの読み込み後から。
 linux-headers更新タイミングと合っていないが、これが原因っぽい。
 更新タイミングが合っていない原因は、2018-10-12 00:41:13のlinux-headers更新後、
 2018-10-27 12:10:09まで再起動していなかったから。
 再起動のタイミングでinitrdが再生成された。

$ uname -a
Linux mo-debian 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux

$ sudo zcat /var/log/syslog.*.gz | sudo cat - /var/log/syslog /var/log/syslog.1 | grep initrd
Oct 27 12:11:29 mo-debian kernel: [    0.654298] Freeing initrd memory: 19352K

$ zgrep -B 3 -F $(uname -r) /var/log/apt/history.log*.gz | sed -e 's/), /&\n/g' | awk '/Start|^linux-headers/&&(NR<30)'
/var/log/apt/history.log.1.gz:Start-Date: 2018-10-05  23:53:05
linux-headers-4.9.0-8-amd64:amd64 (4.9.110-3+deb9u4, 4.9.110-3+deb9u5), 
linux-headers-4.9.0-8-common:amd64 (4.9.110-3+deb9u4, 4.9.110-3+deb9u5), 
/var/log/apt/history.log.1.gz:Start-Date: 2018-10-12  00:41:13
linux-headers-4.9.0-8-amd64:amd64 (4.9.110-3+deb9u5, 4.9.110-3+deb9u6), 
linux-headers-4.9.0-8-common:amd64 (4.9.110-3+deb9u5, 4.9.110-3+deb9u6), 
/var/log/apt/history.log.2.gz:Start-Date: 2018-09-06  19:34:54

$ sudo zgrep "shutting" /var/log/syslog.*.gz
/var/log/syslog.6.gz:Oct 27 12:10:09 mo-debian xrdp-sesman[1160]: (1160)(139946046936384)[INFO ] shutting down sesman 1
/var/log/syslog.6.gz:Oct 27 12:10:09 mo-debian xrdp-sesman[27420]: (27420)(139946046936384)[INFO ] shutting down sesman 1
/var/log/syslog.6.gz:Oct 27 12:10:11 mo-debian snmpd[3389]: Received TERM or STOP signal...  shutting down...
/var/log/syslog.6.gz:Oct 27 12:10:11 mo-debian ModemManager[592]: <info>  Caught signal, shutting down...

$ sudo zgrep shutdown /var/log/auth*.gz /var/log/auth.log{,.1} | \
    awk '(/COMMAND=.sbin/&& $0 !~ /grep/){gsub("mo.*","",$1);print $1,$2,$3,$(NF-2)}'
/var/log/auth.log.4.gz:Oct 1 02:11:14 COMMAND=/sbin/shutdown
/var/log/auth.log.4.gz:Oct 1 20:58:24 COMMAND=/sbin/shutdown
/var/log/auth.log:Nov 2 19:57:10 COMMAND=/sbin/shutdown
/var/log/auth.log.1:Oct 27 12:10:09 COMMAND=/sbin/shutdown

■initrdとlinux-headersにfirmwareが組み込まれているかどうかと言えば、
 5年前にも自分で対処してたことがあった。

 squeezeの2.6.32-48へのアップグレード時の警告対応
 http://d.hatena.ne.jp/labunix/20130226

$ sudo lspci | grep Ether
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 03)

$ sudo find /lib/ -type f -name "r8169.ko"
/lib/modules/4.9.0-7-amd64/kernel/drivers/net/ethernet/realtek/r8169.ko
/lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/realtek/r8169.ko

$ sudo apt-cache search firmware-realtek
firmware-realtek - Binary firmware for Realtek wired/wifi/BT adapters

$ dpkg -l | grep ^ii | grep firmware-realtek | wc -l
0

■initrdに組み込まれていないので、firmware-realtekをインストール。

$ sudo apt-get install -y firmware-realtek
$ dpkg -l | awk '/^ii/&&/firmware-realtek/{gsub("   *",",",$0);print $0}'
ii,firmware-realtek,20161130-3,all,Binary firmware for Realtek wired/wifi/BT adapters

$ sudo dmesg | awk 'gsub("]","",$2){if($2 > "23.101662" && $0 ~ /r8169/){print $0}}'
[ 23.147532 r8169 0000:02:00.0 enp2s0: link down
[ 23.147543 r8169 0000:02:00.0 enp2s0: link down
[ 26.271076 r8169 0000:02:00.0 enp2s0: link up

■initrdに組み込まれているかどうかは以下で確認出来る。

$ file /boot/initrd.img-$(uname -r)
/boot/initrd.img-4.9.0-8-amd64: gzip compressed data, last modified: Fri Nov  2 12:08:34 2018, from Unix

$ gunzip -c /boot/initrd.img-$(uname -r)  | cpio -i -t | grep rtl
lib/firmware/rtl_nic
lib/firmware/rtl_nic/rtl8107e-1.fw
lib/firmware/rtl_nic/rtl8168e-1.fw
lib/firmware/rtl_nic/rtl8168h-1.fw
lib/firmware/rtl_nic/rtl8168f-2.fw
lib/firmware/rtl_nic/rtl8168d-1.fw
lib/firmware/rtl_nic/rtl8105e-1.fw
lib/firmware/rtl_nic/rtl8402-1.fw
lib/firmware/rtl_nic/rtl8411-2.fw
lib/firmware/rtl_nic/rtl8168d-2.fw
lib/firmware/rtl_nic/rtl8168g-2.fw
lib/firmware/rtl_nic/rtl8168g-3.fw
lib/firmware/rtl_nic/rtl8168e-3.fw
lib/firmware/rtl_nic/rtl8411-1.fw
lib/firmware/rtl_nic/rtl8107e-2.fw
lib/firmware/rtl_nic/rtl8168f-1.fw
lib/firmware/rtl_nic/rtl8168h-2.fw
lib/firmware/rtl_nic/rtl8106e-1.fw
lib/firmware/rtl_nic/rtl8168e-2.fw
lib/firmware/rtl_nic/rtl8106e-2.fw
120562 blocks

■余談として、「ASCII cpio archive」形式のinitrdにfirmwareが組み込まれているか確認する方法。
 broadcomドライバの別ホストの場合、binwalkでgzipの開始位置を特定する必要がある。
 ※skip=1が重要

$ sudo lspci | grep Ether
04:00.0 Ethernet controller: Broadcom Limited NetLink BCM57785 Gigabit Ethernet PCIe (rev 10)

$ file /boot/initrd.img-$(uname -r)
/boot/initrd.img-4.9.0-8-amd64: ASCII cpio archive (SVR4 with no CRC)

$ dd if=/boot/initrd.img-$(uname -r) of=/dev/stdout \
     bs=$(binwalk /boot/initrd.img-$(uname -r) | awk '/gzip/{print $1}') skip=1 2>/dev/null | \
     gunzip - | cpio -i -t | grep broadcom
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/b44.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/bnx2.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/bnx2x
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/bnx2x/bnx2x.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/bnxt
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/tg3.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/ethernet/broadcom/cnic.ko
lib/modules/4.9.0-8-amd64/kernel/drivers/net/phy/broadcom.ko
121931 blocks