【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 |
|---|---|---|---|
| 1 | CPU | Core i5-8500T(6コア6スレッド) | Core i5-10505(6コア12スレッド、最大 4.6GHz) |
| 2 | メモリ | DDR4-3200 の 8GB×2 | DDR4-3200 の 8GB×2(2枚の型番がちがう) |
| 3 | SSD | Crucial P3 500GB(NVMe) | 同じもの(差し替えた) |
| 4 | LAN | 1G | 本体の 1G(Realtek RTL8111)と、2.5G のカード(Realtek RTL8125) |
| 5 | BIOS の版 | R1.40.0 | R1.24.0 |
| 6 | 付いてきたもの | — | 500GB の HDD(Windows 入り) |
D7011 の値は、差し替えたあとに次のコマンドで読みました。
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’:
メモリの口ごとの大きさ・場所・速さ・型番。空の口は出さない
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回更新されていたので、すぐに当たりそうでした。
機械専用の形のまま、読み方を足す
そこで、機械専用の形に戻し、起動に要る読み方だけを足す設定にしました。
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 の中に、足した読み方が入ったか
-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 だけ出なかったのは、カーネルの本体に最初から組み込まれていて、別のファイルになっていないためでした。
grep -E 'xhci' /lib/modules/$(uname -r)/modules.builtin- /lib/modules/$(uname -r)/modules.builtin:
今のカーネルの本体に組み込まれている読み方の一覧
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 を直すときに使います(②の記事)。
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 のケーブルを抜き、金属のものに触れて静電気を逃がす |
| 2 | Q558 から外す | ねじを外して NVMe を抜く |
| 3 | D7011 に挿す | M.2 の口に斜めに差し込み、倒してねじで留める |
| 4 | 付いてきた HDD | SATA のケーブルを外しておく。中の Windows が起動の一覧の先頭に来ると、起動の順番で迷いやすいため |
| 5 | つなぐ | 電源・モニター・キーボード・LAN をつなぐ |
NVMe は、D7011 の M.2 の口にそのまま入りました。
場面4:BIOS の設定を保存し忘れて PXE に行った
電源を入れると、AlmaLinux は起きず、次の画面で止まりました。

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 から起こせるように |

保存すると、AlmaLinux が起きてログインの画面が出ました。仮想化の機能(VT-x)が有効なのは、起きたあとに grep -c vmx /proc/cpuinfo が 0 より大きい数(24)になることで確かめました。
あとでもう一度 BIOS に入り、電源の設定が残っているのを見てから、止めて電源のケーブルを抜き、10秒待って挿しました。自分で起きたので、停電のあとも自動で戻ります。停電のあとに自動で起きる仕組みは、こちらの記事に書いています。
場面5:マイクロコードが古いままだった
起きたあと、CPU の名前を見ようと lscpu を全部出したところ、下のほうに「Vulnerable(守られていない)」の行が並んでいました。
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行だけ
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 より新しいものでした。
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 の印
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 000a0653initramfs に入っていたのは Q558 の CPU の分だった
読み込まれなかったのは、initramfs が Q558 の上で作ったものだったからです。機械専用の形の initramfs には、作った機械の CPU の分のマイクロコードしか入りません。中に入っていた GenuineIntel.bin は 105,472 バイトで、この CPU 用の 06-a5-03(98,304 バイト)とは大きさがちがいました。
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:
今回の起動で、カーネルがマイクロコードについて出した記録
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: 0x000000eaD7011 の上で作り直す
D7011 の上で initramfs を作り直して、再起動しました。1回目は作り直しの行が動いておらず(initramfs の日時が Q558 で作ったときのまま)、日時と中身を確かめてから再起動する形にしてやり直しました。
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 の新しい分
起きたあと、同じコマンドで見ると、守りの状態が変わりました。
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; MicrocodeSMT vulnerable は、1コアで2スレッド動かす機能(ハイパースレッディング)を止めないと完全には守れない、という意味です。止めると CPU の力が大きく減るので、このままにしました。これからのカーネルの更新では、D7011 の上で initramfs が作られるので、D7011 の分が入ります。
場面6:UPS の残り時間
D7011 の CPU は電気の枠が 65W で、Q558 の 35W より大きいので、UPS(CyberPower CPJ500)の残り時間が減っていないかを見ました。UPS は NAS に USB でつながっていて、自宅サーバーは NAS に問い合わせて値を読みます(仕組みはこちらの記事)。
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行だけを出す
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. | 前の機械専用だったところ | 起きたこと | 直し方 | 記事 |
|---|---|---|---|---|
| 1 | initramfs の読み方 | そのままだと別の機械や USB のディスクで起きないことがある。全部入りにすると /boot が足りなくなる | add_drivers+=" nvme ahci uas usb_storage xhci_pci " を足して作り直す | この記事の場面2 |
| 2 | initramfs のマイクロコード | Q558 の CPU の分しか入っておらず、古いマイクロコード(0xea)のまま動いた | 新しい機械の上で initramfs を作り直す(0x100 になった) | この記事の場面5 |
| 3 | LAN の設定 | ブリッジの部下の設定が、前の口の名前と MAC を名指ししていて、つながらなかった | 口の名前を変え、MAC の名指しを消す | ②の記事 |
BIOS の設定(起動の順番と電源)は、新しい機械では最初からやり直しになります。富士通の BIOS は F10 で保存しないと元に戻るので、保存したあとにもう一度入って、値が残っているかを見ると確実です。
移す前に、万一に備えて SSD を USB の HDD に丸ごと控えました。その控えから起こしたときにつまずいた話は、③の記事に書きます。



コメント