2021年にThinkPad X32へdebian buster 10.9をインストールする。

このご時世にこんなマシンにインストールするのもどうかと思うのですが、まぁまぁハマりましたでメモ。

構成はこのような感じです。

IBM ThinkPad X32 (2672-MUJ)
CPU : :PentiumM-1.7Ghz
MEM : 1.5GB
SSD : 64GB (玄人志向KRHK-mSATA/I9 + Transcend TS64GMSA230S )
※PATA ↔ mSATA変換基盤にmSATA SSDを載せています


Debianのi386版をインストールして終わりにしたかったのですがどうにもうまくインストールできず。
インストーラーのdmesgを見ると下記の通り、どう頑張ってもmSATAを認識できませんでした。


[ 0.000000] Linux version 4.19.0-16-686 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.181-1 (2021-03-19)
:
[ 12.841405] ata1.00: ATA-9: TS64GMSA230S, 02J*****, max UDMA/133
[ 12.854254] ata1.00: 125045424 sectors, multi 2: LBA48 NCQ (depth 0/32)
:
[ 18.193657] ata1.00: qc timeout (cmd 0x47)
[ 18.204246] ata1.00: READ LOG DMA EXT failed, trying PIO
[ 18.214848] ata1.00: failed to get Identify Device Data, Emask 0x40
[ 18.214854] ata1.00: failed to enable Sense Data Reporting, Emask 0x40
[ 18.214898] ata1.00: failed to set xfermode (err_mask=0x40)
[ 18.517417] ata1.01: NODEV after polling detection
[ 23.569626] ata1.00: qc timeout (cmd 0xec)
[ 23.580211] ata1.00: failed to IDENTIFY (I/O error, err_mask=0x4)
[ 23.590738] ata1.00: revalidation failed (errno=-5)
[ 28.637804] ata1: link is slow to respond, please be patient (ready=0)
[ 33.625803] ata1: device not ready (errno=-16), forcing hardreset
[ 38.833802] ata1: link is slow to respond, please be patient (ready=0)
[ 43.641800] ata1: SRST failed (errno=-16)
[ 48.849800] ata1: link is slow to respond, please be patient (ready=0)
[ 53.657802] ata1: SRST failed (errno=-16)
[ 58.865616] ata1: link is slow to respond, please be patient (ready=0)
[ 88.693804] ata1: SRST failed (errno=-16)
[ 93.721799] ata1: SRST failed (errno=-16)
[ 93.743646] ata1: reset failed, giving up
[ 93.754045] ata1.00: disabled

qc timeoutってなんですか?という感じですが、Linux kernelの問題のようでこのような挙動になるようです。
なお、Windows7はインストールできるので、mSATAに問題はなさそうです。

調べてみると、下記の記事が見つかりました。

Kernel.org Bugzilla – Bug 195895 – failed to set xfermode (err_mask=0x40) on some SSDs
https://bugzilla.kernel.org/show_bug.cgi?id=195895

→ fails: ATA_HORKAGE_NO_DMA_LOG ということで、この方の作成したpatchをkernel build時に充ててあげるとうまく動いた例もあるようなので、これを試してみます。 drivers/ata/libata-core.c に nodmalog という個所を追記し、カーネル起動パラメータに libata.force=nodmalog を入れることで、上記のエラーを解消できるようにします。

パッチはこちら
0001-libata-add-kernel-parameter-to-force-ATA_HORKAGE_NO_.patch
https://bugzilla.kernel.org/attachment.cgi?id=295611

[カーネルの再構築]
大まかな手順はここ
https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html#s-common-official

対象のマシンでは起動できないため、いったん別PCのVMなどでDebian10.9 i386をインストールし、カーネルの再構築環境を整えて作成します。
(下記は別マシンでの作業です。)


$ cd ~/
$ sudo apt-get install build-essential fakeroot
$ sudo apt-get build-dep linux
$ apt-get source linux
$ wget https://bugzilla.kernel.org/attachment.cgi?id=295611 -O 0001-libata-add-kernel-parameter-to-force-ATA_HORKAGE_NO_.patch
$ cd linux-4.19.181
$ sudo apt-get install devscripts
$ bash debian/bin/test-patches -f i386 ../0001-libata-add-kernel-parameter-to-force-ATA_HORKAGE_NO_.patch
$ sudo apt-get install libncurses
$ make nconfig
 → General setup の Localversion を "nodmalog-1.0" とでも入れておきます。
$ nice make -j6 bindeb-pkg
 → 一晩待ちましょう。恐ろしく時間がかかります。
  上記のコマンドで、とりあえず下記のファイルができあがります。大事にとっておきましょう。
  linux-image-4.19.181nodmalog-1.0_4.19.181nodmalog-1.0-1_i386.deb
  linux-headers-4.19.181nodmalog-1.0_4.19.181nodmalog-1.0-1_i386.deb
  linux-libc-dev_4.19.181nodmalog-1.0-1_i386.deb
$ ls -la .arch/x86/boot/bzImage (vmlinuzの元になります)

ここまでで、Debian-installerのvmlinuzとinitrd.gzを上記で作成したkernelへ置き換えることで、インストーラー起動時にSSDを認識できるようになります。本来のThinkPad X32で起動すると下記の通り起動できインストールができるようになります。
(起動時のカーネルパラメータに、libata.force=nodmalogを入れて起動してください。)


[ 0.000000] Linux version 4.19.181nodmalog-1.0 (user@debian) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Sun May 23 11:21:22 JST 2021
:
[ 0.089579] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.19.181nodmalog-1.0 root=UUID=********-****-****-****-************ ro libata.force=nodmalog splash quiet
:
[ 6.823710] ata1.00: FORCE: horkage modified (nodmalog)
[ 6.823880] ata1.00: ATA-9: TS64GMSA230S, 02J*****, max UDMA/133
[ 6.823883] ata1.00: 125045424 sectors, multi 2: LBA48 NCQ (depth 0/32)
[ 6.834950] scsi 0:0:0:0: Direct-Access ATA TS64GMSA230S TBD1 PQ: 0 ANSI: 5
[ 6.842091] sd 0:0:0:0: [sda] 125045424 512-byte logical blocks: (64.0 GB/59.6 GiB)
[ 6.842107] sd 0:0:0:0: [sda] Write Protect is off
[ 6.842110] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 6.842129] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 6.857932] sda: sda1 sda2 < sda5 >
[ 6.858455] sd 0:0:0:0: [sda] Attached SCSI disk

インストーラーへのvmlinuz組み込み、initrd.gzに入れた方法はごちゃごちゃしてしまったんで、後日追記しまとめます。下記のとおりです。

[追記:インストーラーへのvmlinuz組み込み、initrd.gzへの組み込み方法]
今回は、hd-mediaのinstallerイメージにあるvmlinuzとinitrd.gzを変更し、USBメモリ(2GB程度あれば充分)に書き込みます。
https://deb.debian.org/debian/dists/buster/main/installer-i386/current/images/hd-media/

initrd.gzに今回作成したカーネルモジュールを展開する。


$ cd ~/
$ wget https://deb.debian.org/debian/dists/buster/main/installer-i386/current/images/hd-media/gtk/initrd.gz
$ wget https://(最寄りのdebianミラーから)/debian-10.9.0-i386-netinst.iso
$ mkdir initrd_modify && cd initrd_modify
$ zcat ../initrd |cpio -idmv
$ dpkg-deb -xv linux-image-4.19.181nodmalog-1.0_4.19.181nodmalog-1.0-1_i386.deb ./
$ find | cpio -o -H newc | gzip -c > ../initrd_nodmalog.gz

出来上がった initrd_nodmalog.gzは次の作業でUSBメモリにコピーします。
(中身が消えてもいいUSBメモリは /dev/sdXに刺さっているとします。)


$ sudo apt-get install mbr
$ sudo install-mbr /dev/sdX
$ sudo mkdosfs /dev/sdX1
$ sudo syslinux /dev/sdX1
$ sudo mount /dev/sdX1 /mnt
$ sudo vi /mnt/syslinux.cfg
default vmlinuz initrd=initrd_nodmalog.gz forcepae vga=788 libata.force=nodmalog
(↑この内容1行をsyslinux.cfgに記載する)
$ sudo cp initrd_nodmalog.gz /mnt/
$ sudo cp ~/linux-4.19.181/arch/x86/boot/bzImage /mnt/vmlinuz
$ sudo cp ~/linux-image-4.19.181nodmalog-1.0_4.19.181nodmalog-1.0-1_i386.deb /mnt/
$ sudo cp ~/debian-10.9.0-i386-netinst.iso /mnt/
$ sudo umount /mnt
$ eject /dev/sdX

上記でUSBメモリの中に、今回作成したdebパッケージ、vmlinuz(bzImage)、initrd_nodmalog.gz、debianのインストーラーisoをコピーします。
あとはこの出来上がったUSBメモリでインストールを実施します。(うまく起動できるといいですね。)
実際にインストールする際、インストールの途中と最後で工夫が必要です。

1.インストーラーISOイメージからコンポーネントをロード


インストーラ起動後、言語等の設定をして進むと、この質問が表示されます。カーネルが違うからなので、カーネルモジュールをロードせずインストールを続けますか?に対して「はい」で続行します。

2.インストールの完了


このまま終わってはいけません。ここで ALT+F2(またはCTRL+ALT+F2)を押して、ターミナルに入りましょう。

3.Please press Enter to activate this console.


ここでエンターキー押してください。

4.コマンド投入1 (USBメモリにあるnodmalogカーネルdebをSSDの/tmpへコピーするのと、chrootするのと)



# cp /hd-media/linux-image-4.19.181nodomalog-1.0-1_i386.deb /target/tmp
# chroot /target

5.コマンド投入2 (SSDの/tmpに入れたパッケージをインストールする)



# bash (お好みで)
# dpkg -i /tmp/linux-image-4.19.181nodomalog-1.0-1_i386.deb
(/dev関連でエラー表示がでる場合もあります。/boot にこのカーネルが入ればOKです。)

6.grub.confにカーネル起動パラメータを入れておく



# vi /etc/default/grub
GRUB_CMDLINE_LINUX="libata.force=nodmalog"
# update-grub
または、(推奨しない方法)
# vi /boot/grub/grub.cfg

linux /boot/vmlinuz-4.19.181nodmalog-1.0 root=**** ro quiet あたりの行を
linux /boot/vmlinuz-4.19.181nodmalog-1.0 root=**** ro libata.force=nodmalog quiet あたりに編集する

7.インストーラの画面に戻り、インストール完了、再起動をする。


ALT+F5(またはCTRL+ALT+F5)でこの画面に戻るので、「続ける」をクリックしてインストールを完了します。

8.SSDから起動し、grubを表示させる。


あともう少し。念の為いったん e を入力しカーネルパラメータなどを表示させます。

9.カーネルパラメータの確認


libata.force=nodmalog があるのを確認してください。なければここで記載するのもありです。
CTRL+X でカーネルが読み込まれdebianが起動するはずです。

10.起動した!


もうこれで起動してるだけでOKなんですが。
dmesgあたりで、FORCE: horkage modified (nodmalog)が表示され、今回のカーネルパラメータが効いていることを確認します。

また古いマシンを延命しおって。。。
ThinkPad X32でdebian busterを楽しんでください!