[PR] 本記事にはプロモーションが含まれています。

【自宅サーバー】Q558 から D7011 へ、SSD をそのまま差し替えた|initramfs・BIOS の保存忘れ・古いマイクロコード

小さな PC から一回り大きなデスクトップへ、SSD を差し替えるイメージ 自宅サーバー構築
➔ 自宅サーバー構築メモの目次はこちら

【2026年11月8日時点の情報です】

自宅サーバー(KVM のホスト)を、富士通の小さな PC「ESPRIMO Q558」から、デスクトップの「ESPRIMO D7011/G」に替えました。Q558 は再起動のときにメーカーのロゴの画面で止まることがあり、BIOS を最新にしても直らなかったので、来年の予定だった買い替えを前倒ししました(BIOS の更新の話はこちらの記事)。

移し方は、いちばん手間の少ない「NVMe の SSD を、そのまま新しい PC に差し替える」にしました。AlmaLinux 9 を入れ直さず、仮想マシン(ブログの WordPress が動いている)もそのまま動かします。

この記事では、差し替えの前の準備から、差し替えたあとに起きるまでと、起きたあとに見つけた「古いマイクロコードのまま動いていた」件までを書きます。LAN がつながらなかった話と、移す前に SSD を丸ごと控えた話は、それぞれ別の記事に分けました。

登場するユーザー名、ホスト名、IP アドレスなどは、セキュリティのため実際とは異なる架空のものに置き換えています。

場面1:2台をくらべる

新しい D7011 は、CPU が2世代新しくなり、スレッドの数が倍になりました。LAN は、2.5G の LAN カードを買って取り付けました。

No.項目前:ESPRIMO Q558今:ESPRIMO D7011/G
1CPUCore i5-8500T(6コア6スレッド)Core i5-10505(6コア12スレッド、最大 4.6GHz)
2メモリDDR4-3200 の 8GB×2DDR4-3200 の 8GB×2(2枚の型番がちがう)
3SSDCrucial P3 500GB(NVMe)同じもの(差し替えた)
4LAN1G本体の 1G(Realtek RTL8111)と、2.5G のカード(Realtek RTL8125)
5BIOS の版R1.40.0R1.24.0
6付いてきたもの—500GB の HDD(Windows 入り)

D7011 の値は、差し替えたあとに次のコマンドで読みました。

Bash
sudo dmidecode -s system-product-name
sudo dmidecode -s bios-version
LANG=C lscpu | grep -E '^(Model name|CPU\(s\):|Thread)'
sudo dmidecode -t memory | grep -E '^\s+(Size|Locator|Speed|Part Number):' | grep -v 'No Module'
  • sudo dmidecode -s system-product-name:
    機械の型の名前(BIOS に書かれたもの)
  • sudo dmidecode -s bios-version:
    BIOS の版
  • LANG=C lscpu | grep …:
    CPU の名前とスレッドの数。LANG=C を前に付けると、そのコマンドだけ表示が英語になり、Model name の行で探せる(日本語の表示のままだと当たらない)
  • sudo dmidecode -t memory | grep … | grep -v ‘No Module’:
    メモリの口ごとの大きさ・場所・速さ・型番。空の口は出さない
Plaintext
FMVD52001
V5.0.0.19 R1.24.0 for D3923-A2x
  Model name:                Intel(R) Core(TM) i5-10505 CPU @ 3.20GHz
CPU(s):                      12
    Thread(s) per core:      2
        Size: 8 GiB
        Locator: Controller0-ChannelA-DIMM0
        Speed: 3200 MT/s
        Part Number: 4ATF1G64AZ-3G2B1
        Size: 8 GiB
        Locator: Controller0-ChannelB-DIMM0
        Speed: 3200 MT/s
        Part Number: 7D402577

付いてきた HDD は、BIOS の更新用の Windows として残し、ケーブルを外して D7011 の中に置いておきます。Q558 は BIOS の更新に Windows が要り、予備の SSD に Windows を入れて苦労したので、その手間を省くためです。

場面2:移す前に initramfs を直す

initramfs は、Linux が起動のいちばん最初に読む小さな部品の束で、SSD を読むためのドライバなどが入っています。AlmaLinux 9 はふつう「この機械専用の形」(initramfs を作る道具 dracut の hostonly モード)で作るので、今の機械で使っている読み方しか入っていません。そのままだと、別の機械では SSD や USB のディスクを読めず、起きないことがあります。組み込みで言えば、今の基板に載っているデバイスのドライバだけをリンクしたファームのようなものです。

全部入りの形にしたら、/boot が足りなくなりそうだった

最初に、機械専用でない形(hostonly="no")で作り直しました。読めるものは増えましたが、大きさが 45M から 235M になり、/boot(960M)の空きが 483M から 293M に減りました。カーネルの自動の更新は3つの版を残すので、あと2回ほど更新が来ると /boot に入りきらず、更新が失敗します。この1週間で3回更新されていたので、すぐに当たりそうでした。

機械専用の形のまま、読み方を足す

そこで、機械専用の形に戻し、起動に要る読み方だけを足す設定にしました。

Bash
sudo cp -p /boot/initramfs-$(uname -r).img /root/initramfs-$(uname -r).img.hostonly
echo 'add_drivers+=" nvme ahci uas usb_storage xhci_pci "' | sudo tee /etc/dracut.conf.d/90-portable-drivers.conf
sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
ls -lh /boot/initramfs-$(uname -r).img
sudo lsinitrd /boot/initramfs-$(uname -r).img | grep -oE '(uas|usb-storage|ahci|nvme|xhci-pci)\.ko[^ ]*' | sort -u
  • sudo cp -p … .hostonly:
    今の initramfs の控え。戻すときは、これを /boot/ に戻す
  • add_drivers+=” … “:
    機械専用の形のまま、名前を挙げた読み方を足す設定。+= は前からある設定に足す書き方
  • nvme・ahci・uas・usb_storage・xhci_pci:
    NVMe の SSD、SATA のディスク、USB のディスク(新しい形と古い形)、USB 3.0 の口の読み方
  • sudo tee /etc/dracut.conf.d/90-portable-drivers.conf:
    設定のファイルを root の権限で書く
  • sudo dracut –force …:
    この設定で initramfs を作り直す
  • sudo lsinitrd … | grep -oE ‘…’:
    initramfs の中に、足した読み方が入ったか
Plaintext
-rw------- 1 root root 45M 11月  7 12:52 /boot/initramfs-5.14.0-687.66.1.el9_8.x86_64.img
ahci.ko.xz
nvme.ko.xz
uas.ko.xz
usb-storage.ko.xz

大きさは 45M のままで、4つが入りました。xhci-pci だけ出なかったのは、カーネルの本体に最初から組み込まれていて、別のファイルになっていないためでした。

Bash
grep -E 'xhci' /lib/modules/$(uname -r)/modules.builtin
  • /lib/modules/$(uname -r)/modules.builtin:
    今のカーネルの本体に組み込まれている読み方の一覧
Plaintext
kernel/drivers/usb/host/xhci-hcd.ko
kernel/drivers/usb/host/xhci-pci.ko
kernel/drivers/usb/host/xhci-pci-renesas.ko

このあと、SSD を USB の HDD に丸ごと控えました(③の記事)。控えの HDD を USB から起こすときにも、この uas・usb-storage が要ります。

場面3:NVMe を移す

差し替えのあいだは、ブログ(仮想マシンの WordPress)も止まります。止める前に、仮想マシンの状態と、LAN の口の名前を見ておきました。口の名前は、差し替えたあとに LAN を直すときに使います(②の記事)。

Bash
sudo virsh list --all
ip -br link
sudo poweroff
  • sudo virsh list –all:
    仮想マシンの一覧と状態
  • ip -br link:
    LAN の口の一覧を1行ずつ出す。-br は短い形(brief)
  • sudo poweroff:
    止める。libvirt-guests の設定で、仮想マシンを先に正しくシャットダウンしてから止まる

止まったら、次の順で差し替えました。

No.操作中身
1電源を抜く電源と LAN のケーブルを抜き、金属のものに触れて静電気を逃がす
2Q558 から外すねじを外して NVMe を抜く
3D7011 に挿すM.2 の口に斜めに差し込み、倒してねじで留める
4付いてきた HDDSATA のケーブルを外しておく。中の Windows が起動の一覧の先頭に来ると、起動の順番で迷いやすいため
5つなぐ電源・モニター・キーボード・LAN をつなぐ

NVMe は、D7011 の M.2 の口にそのまま入りました。

場面4:BIOS の設定を保存し忘れて PXE に行った

電源を入れると、AlmaLinux は起きず、次の画面で止まりました。

起動の順番が LAN のままで、PXE の画面で止まった D7011(MAC アドレスはぼかしてある)

Start PXE over IPv4 は「起動できるディスクが見つからないので、LAN から起動しようとしている」という意味です。家の LAN には起動のもとがないので、待っていても進みません。SSD が壊れたのではなく、起動の順番が LAN のままでした。

原因は、BIOS の設定を変えたつもりで、保存していなかったことです。富士通の BIOS は、変えたあとに F10(または「終了」の「変更を保存して終了」)で出ないと、元に戻ります。Q558 で電源の設定を変えたときも、1回目は保存されていませんでした。

電源ボタンの長押しで切り、もう一度 F2 で BIOS に入って、次を設定し直して F10 で保存しました。

No.画面項目値わけ
1起動起動の順番AlmaLinux をいちばん上にLAN(PXE)から起動しようとしないように
2電源管理AC通電再開時の動作電源ON停電のあと、電気が戻ったら自分で起きる
3電源管理電源オフ時の USB/PS2 電源供給電源ON止まっているあいだも電気を送る(Q558 では「電源オフ時の電源供給」という名前だった)
4電源管理LAN によるウェイクアップ使用するLAN から起こせるように
D7011 の BIOS の電源管理の画面。AC通電再開時の動作と、電源オフ時の USB/PS2 電源供給が電源ON

保存すると、AlmaLinux が起きてログインの画面が出ました。仮想化の機能(VT-x)が有効なのは、起きたあとに grep -c vmx /proc/cpuinfo が 0 より大きい数(24)になることで確かめました。

あとでもう一度 BIOS に入り、電源の設定が残っているのを見てから、止めて電源のケーブルを抜き、10秒待って挿しました。自分で起きたので、停電のあとも自動で戻ります。停電のあとに自動で起きる仕組みは、こちらの記事に書いています。

場面5:マイクロコードが古いままだった

起きたあと、CPU の名前を見ようと lscpu を全部出したところ、下のほうに「Vulnerable(守られていない)」の行が並んでいました。

Bash
LANG=C lscpu | grep -iE 'microcode|Gather|Srbds|Mmio'
grep -m1 microcode /proc/cpuinfo
  • LANG=C lscpu | grep -iE ‘…’:
    CPU の弱いところと、その守りの状態のうち、マイクロコードにかかわる行だけを出す。-i は大文字と小文字を区別しない
  • grep -m1 microcode /proc/cpuinfo:
    今 CPU が使っているマイクロコードの版。-m1 は最初の1行だけ
Plaintext
Vulnerability Gather data sampling:      Vulnerable: No microcode
Vulnerability Mmio stale data:           Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
Vulnerability Old microcode:             Vulnerable
Vulnerability Srbds:                     Vulnerable: No microcode
microcode       : 0xea

マイクロコードは、CPU の中の動きを直す小さなプログラムで、Linux が起動のいちばん最初(initramfs)で CPU に読み込ませます。組み込みで言えば、マイコンの中のパッチを、起動のたびにブートローダが当てているようなものです。

新しい版は手元にあった

AlmaLinux の microcode_ctl のパッケージには、この CPU 用のファイル(06-a5-03。ファミリー6・モデル 0xa5・ステッピング3)が入っていました。ファイルの先頭を読むと、版は 0x100(2024年11月14日)で、今の 0xea より新しいものでした。

Bash
ls -l /lib/firmware/$(uname -r)/intel-ucode/06-a5-03
od -An -tx4 -N16 /usr/share/microcode_ctl/ucode_with_caveats/intel/intel-ucode/06-a5-03
  • ls -l /lib/firmware/$(uname -r)/intel-ucode/06-a5-03:
    今のカーネル用の置き場に、この CPU の分がつながれているか。AlmaLinux では /lib/firmware/intel-ucode/ ではなく、カーネルの版ごとの場所につながれる
  • od -An -tx4 -N16 …:
    ファイルの先頭16バイトを、4バイトずつ16進で出す(ヘッダーのダンプ)。2つ目が版、3つ目が日付、4つ目が CPU の印
Plaintext
lrwxrwxrwx 1 root root 70 11月  6 06:21 /lib/firmware/5.14.0-687.66.1.el9_8.x86_64/intel-ucode/06-a5-03 -> /usr/share/microcode_ctl/ucode_with_caveats/intel/intel-ucode/06-a5-03
 00000001 00000100 11142024 000a0653

initramfs に入っていたのは Q558 の CPU の分だった

読み込まれなかったのは、initramfs が Q558 の上で作ったものだったからです。機械専用の形の initramfs には、作った機械の CPU の分のマイクロコードしか入りません。中に入っていた GenuineIntel.bin は 105,472 バイトで、この CPU 用の 06-a5-03(98,304 バイト)とは大きさがちがいました。

Bash
sudo lsinitrd /boot/initramfs-$(uname -r).img | sed -n '1,12p'
sudo journalctl -k -b --no-pager | grep -i microcode
  • sudo lsinitrd … | sed -n ‘1,12p’:
    initramfs の中身の一覧の最初の12行。Early CPIO image の欄が、起動のいちばん最初に読まれるマイクロコードの部分
  • sudo journalctl -k -b –no-pager | grep -i microcode:
    今回の起動で、カーネルがマイクロコードについて出した記録
Plaintext
Early CPIO image
-rw-r--r--   1 root     root       105472 Aug 14 09:41 kernel/x86/microcode/GenuineIntel.bin
x86/CPU: Running old microcode
microcode: Current revision: 0x000000ea

D7011 の上で作り直す

D7011 の上で initramfs を作り直して、再起動しました。1回目は作り直しの行が動いておらず(initramfs の日時が Q558 で作ったときのまま)、日時と中身を確かめてから再起動する形にしてやり直しました。

Bash
sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
ls -l --time-style=+%m/%d_%H:%M /boot/initramfs-$(uname -r).img
sudo cat /boot/initramfs-$(uname -r).img | cpio -i --quiet --to-stdout kernel/x86/microcode/GenuineIntel.bin | od -An -tx4 -N16
sudo systemctl reboot
  • sudo dracut –force …:
    D7011 の上で initramfs を作り直す。場面2で足した読み方の設定も、そのまま入る
  • ls -l –time-style=…:
    日時が今の時刻なら、作り直せた
  • sudo cat … | cpio -i –quiet –to-stdout kernel/x86/microcode/GenuineIntel.bin:
    initramfs は root しか読めないので、sudo cat で読んで渡し、最初の部分(cpio という束ねる形)からマイクロコードのファイルだけを取り出す。sudo cpio … < ファイル と書くと、< が今のユーザーの権限で開かれて読めない
  • od -An -tx4 -N16:
    取り出したものの先頭16バイト。00000100 … 000a0653 なら、この CPU の新しい分

起きたあと、同じコマンドで見ると、守りの状態が変わりました。

Plaintext
microcode       : 0x100
Vulnerability Gather data sampling:      Mitigation; Microcode
Vulnerability Mmio stale data:           Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Old microcode:             Not affected
Vulnerability Srbds:                     Mitigation; Microcode

SMT vulnerable は、1コアで2スレッド動かす機能(ハイパースレッディング)を止めないと完全には守れない、という意味です。止めると CPU の力が大きく減るので、このままにしました。これからのカーネルの更新では、D7011 の上で initramfs が作られるので、D7011 の分が入ります。

場面6:UPS の残り時間

D7011 の CPU は電気の枠が 65W で、Q558 の 35W より大きいので、UPS(CyberPower CPJ500)の残り時間が減っていないかを見ました。UPS は NAS に USB でつながっていて、自宅サーバーは NAS に問い合わせて値を読みます(仕組みはこちらの記事)。

Bash
upsc ups@192.168.0.30 2>/dev/null | grep -E '^(ups.status|ups.load|ups.realpower.nominal|battery.charge|battery.runtime):'
  • upsc ups@192.168.0.30:
    NAS(ここでは 192.168.0.30 とする)の UPS の値を全部聞く
  • grep -E ‘^(…):’:
    その中から、状態・使っている力の割合・力の上限・電池の残り・電池でもつ秒数の5行だけを出す
Plaintext
battery.charge: 100
battery.runtime: 4875
ups.load: 13
ups.realpower.nominal: 300
ups.status: OL

使っている力は 300W の 13%(約39W)で、電池で約81分もちます。メインPC とモニターもつないだままの値で、Q558 のとき(14〜23%)と変わりませんでした。停電のときは5分で NAS が止まり、そのあとすぐ自宅サーバーも止まる決まりなので、今のままで足ります。

まとめ

SSD をそのまま差し替えるだけで、AlmaLinux も仮想マシンも入れ直さずに新しい PC で動きました。ただし、「前の機械専用」になっているところが3つあり、直す必要がありました。

No.前の機械専用だったところ起きたこと直し方記事
1initramfs の読み方そのままだと別の機械や USB のディスクで起きないことがある。全部入りにすると /boot が足りなくなるadd_drivers+=" nvme ahci uas usb_storage xhci_pci " を足して作り直すこの記事の場面2
2initramfs のマイクロコードQ558 の CPU の分しか入っておらず、古いマイクロコード(0xea)のまま動いた新しい機械の上で initramfs を作り直す(0x100 になった)この記事の場面5
3LAN の設定ブリッジの部下の設定が、前の口の名前と MAC を名指ししていて、つながらなかった口の名前を変え、MAC の名指しを消す②の記事

BIOS の設定(起動の順番と電源)は、新しい機械では最初からやり直しになります。富士通の BIOS は F10 で保存しないと元に戻るので、保存したあとにもう一度入って、値が残っているかを見ると確実です。

移す前に、万一に備えて SSD を USB の HDD に丸ごと控えました。その控えから起こしたときにつまずいた話は、③の記事に書きます。

コメント