Skip to content

Instantly share code, notes, and snippets.

@zgock999
Last active December 14, 2025 18:39
Show Gist options
  • Select an option

  • Save zgock999/c6c50359e20e741303a643e6cfadcdba to your computer and use it in GitHub Desktop.

Select an option

Save zgock999/c6c50359e20e741303a643e6cfadcdba to your computer and use it in GitHub Desktop.
作業PC更新2025令和最新版

作業PC更新記録2025令和最新版

これはmstdn.maud.ioアドカレ2025用のエントリです

今年はかなり大掛かりに作業PCを更新したのでその記録。

発端

2025年頭の時点では自宅ワークステーション友の会としてSkyLake-EPのXeon Platinum 8168搭載のDell Precision 7820を使っていたのだけど、 サブ機のLinuxサーバーとして使用していたX99機(core i7 5920K)とX390機(Threadripper 1920X)のM/Bがお亡くなりになったのでPrecision君をサーバーに下げてメイン機をいっちょ組むかという流れに この時点では「Ryzen 5xxx系ぐらいでさくっと組んだらええよね」と思っていたのにどうしてこうなった。

Act1 Ryzen 7 3700X編

この時点では

  • CPU : Ryzen 5xxx系の何か。5700Xぐらい?
  • GPU : Precisionで使ってたRTX 5060Tiを流用
  • Mem : 手持ちのDDR4 64GBを流用
  • Storage : 手持ちのnvme 2TBを流用(precision君には旧X99機で使ってたSATA 2TBを流用)

ぐらいでええかなと思い、M/B(Asrock B450M Pro4)とRyzen 7 5700Xをじゃんぱらで調達

最初はこれで終わるつもりだったんですよ!本当ですよ?

届いたM/Bに5700Xを突っ込んでみたところ、BIOSの問題で5700Xで立ち上がらないことが発覚

ここからが地獄の始まりでした

パソコン工房なりに5000円握って持ち込んでBIOS書き換えサービスを受けることも考えたのだけど、 「3700Xぐらい調達してBIOS書き換えた方がよくね?」と思い立ち、大須のドスパラへ。

大須のドスパラに行くと、GigabyteのハイエンドマザーX570 AORUS Proがお値打ち価格で転がっており、 「3700X買うことでCPU一個余るよね?」ということでつい調達。

このX570 AORUS Pro機は後に「バカのKVMサーバー」になるのだけどこれは別の機会に。

SilverStoneのmATXキューブがお気に入りなので、5インチリムーバブルベイx5を搭載した SST-CS351に M/Bと3700X、RTX5060Tiを組み込んで第一次メインPCとりあえずの完成

試しでVRChatを起動してQuest3で繋いでみると全然FPSが出ず(20FPSぐらい?)、VR酔いを起こしてしまうのでぴけぴけ先生に相談。 「3700XだとCPUボトルネックなんじゃないかなあ」ということでCPU更新を考慮。

5700Xではまだ非力じゃないかということで5800X3Dを候補として調べてみると、5800X3DはAM4としては最終ゴールとも言えるCPUだけに中古相場もかなり割高で、 ほとんど差がない価格で7800X3D等が買えてしまう状態であることが判明。

「ならもういっそAM5環境にしちゃう?」って考えるのが本当に末代だと自分でも思います

そんなことを考えていたらrootY氏が名古屋に来るというのでかぐら君と一緒に大須で迎撃することに

その大須でRADEON RX7900XTXの難あり品を85000円で発見してしまう。

「AM5マザーとDDR5はいつでも買えるが、このRX7900XTXは買い逃したらまた見つかる保証がない」

と考え調達。(2025-12-14現在、実はDDR5もいつでも買えると思っていてはいけなかったわけですが)

とりあえずRTX5060TiをRX7900XTXに交換。VRChatのFPSは変わらないのでCPUボトルネックであることは間違いないと結論づけたところで 第一次メインPC編は一応の決着

Act2 Ryzen 9 7950X3D編

明けておちんぎんも入ったところで、AM5マザー(ASRock B650M Pro RS Wifi)とCPU(Ryzen 9 7950X3D)、DDR5メモリ(48GB * 4)を調達

さらに謎ルートからWD Black SN850X 4TBも2本調達

元から持っていたSN850X 4TBと合わせて4TB nvme*3という構成に。

なんで3発用意したかというと、nvme raid-zがやりたかったから。

つまり 「Linuxホスト上のraid-zアレイからzvolを切り出して、raid-z保護された環境でWin11ゲストを動かしたかった」 わけですね

今回は  - /bootと/boot/efiは適当なUSBメモリに置く

  • nvme raid-zアレイにホストのrootfsとゲスト用のzvolを置く
  • zvolからGPUパススルーしたWindows11をブート

とまあこういう構成です。 変態ですね

ところが、設定を詰めているうちに、RX7900XTXがRADEONにありがちなVBIOSバグで実行中のリセットが効かない個体であることが判明。

GPUパススルーがとても面倒であることが発覚して一度計画が振り出しに。

しょうがないので一旦普通にWindowsで構築してnvme*3はAMDのオンボードRAID機能でRAID-0として使うことに。

「RTX5060Tiをこっちに戻してRX7900XTXをLLMサーバーに送る?いやでもあっちのケースにクソデカRX7900XTX入らないべや?」

と悶々としながらしばらくWindows環境で運用する日々に

VRChatは相当に重いワールドでも90FPS貼り付き余裕のつよつよ環境にはなったし、nvme*3 raid-0はさすがに頭おかしいぐらいに高速なので堪能はしつつも、

「俺がやりたかったのはこういうことじゃないだよなぁっ!」

と思いながらしばらく運用

Rev 03 真Ryzen 9 7950X3D編

そんな折、ヤフオクを覗いていたら

  • Threadripper 3970X
  • 128GB DDR4(16GB*8)
  • Geforce RTX3090 24GB
  • nvme 2TB SSD*2

という構成でリーズナブルなお値段のおそらく生成AI用サーバーの出物を発見、衝動買いしてしまう

このサーバーと現行作業PCをニコイチして

  • CPU : Ryzen 9 7950X3D
  • GPU : Geforce RTX3090 24GB
  • Mem : 192GB DDR5(48GB*4)
  • Storage : nvme 4TB SSD*3
  • M/B : ASRock B650M Pro RS Wifi

という構成でやっと構想どおりの環境が組めるハード環境が整う。

ハードをくみ上げ本格的にセットアップ開始。やっと今回のアドカレで書きたかった本題に入れる

Step0 bios設定

ホスト側デスクトップ管理を7950X3DのiGPU、ゲストにRTX3090を当てるので UEFI biosを弄って以下のように

  • iGPUを有効にし、iGPUをプライマリにする
  • SVN modeとIOMMUをenableにする(後々kvmで使う)

Step1 インストールとストレージ環境セットアップ

まずはraid-z構築とホスト環境構築から。ブート用のUSBスティック16GBを用意してxubuntu 24.04LTS Liveを起動。

openSUSEのおたくではあるけど今回はzfs rootをやりたかったのでxubuntuを採用。

ツールチェイン取得

sudo -i
apt install -y zfsutils-linux debootstrap gdisk

でrootfsの構築に必要な道具を用意してインストール開始。

ストレージセットアップ

ブート用メモリは/dev/sdbだったので、

# パーティション情報の消去
sgdisk --zap-all /dev/sdb

# パーティション作成
# 1: EFI System Partition (512MB)
# 2: /boot (8GB - カーネル更新用に余裕を持たせる)
sgdisk -n 1:0:+512M -t 1:EF00 /dev/sdb
sgdisk -n 2:0:+8G   -t 2:8300 /dev/sdb

# フォーマット
mkfs.vfat -F32 /dev/sdb1
mkfs.ext4 -L boot /dev/sdb2

としてまずはUSBスティックのフォーマット。続いてzpoolを作成

# ashift=12 (4kセクタ), lz4圧縮, 
zpool create -f -o ashift=12 \
 -O compression=lz4 \
 -O acltype=posixacl \
 -O xattr=sa \
 -O relatime=on \
 -O normalization=formD \
 -O mountpoint=none \
 -O canmount=off \
 -O dnodesize=auto \
 -R /mnt \
 rpool raidz /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1

ストレージのマウント

rootとhome用のdatasetを作成して/mntにマウント

# ルートデータセット
zfs create -o mountpoint=/ -o canmount=noauto rpool/ROOT
zfs create -o mountpoint=/ rpool/ROOT/ubuntu

# ホームデータセット
zfs create -o mountpoint=/home rpool/home

# ルートをマウント
zfs mount rpool/ROOT/ubuntu

# ディレクトリ作成
mkdir -p /mnt/boot
mkdir -p /mnt/home

# homeをマウント
zfs mount rpool/home

zfs部分をマウント後、/bootと/boot/efiにUSBスティックのブート領域をマウント

mount /dev/sdb2 /mnt/boot
mkdir -p /mnt/boot/efi
mount /dev/sdb1 /mnt/boot/efi

ubuntuインストールとchroot

マウント後、debootstrapでubuntuのミニマル状態をインストール。今回は24.04LTSだからnobleで。

debootstrap noble /mnt http://jp.archive.ubuntu.com/ubuntu/

インストール後、live環境から/etc/apt/以下だけインストールした環境にコピーして、いつもの/dev、/proc、/sysをbindしてchrootする。

cp -r /etc/apt/* /mnt/etc/apt/
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash

ロケール設定

chroot環境ではlocalectlが使えないのでupdate-localeでロケールをjpにして、キーマップを日本語にする

locale-gen ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8
dpkg-reconfigure keyboard-configuration
# initramfsを更新してキーマップを永続化
update-initramfs -u
# タイムゾーンをAsia/Tokyoに設定
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# ホスト名 (例: my-zfs-pc)
echo "my-zfs-pc" > /etc/hostname
echo "127.0.0.1 my-zfs-pc" >> /etc/hosts

パッケージインストール

# カーネルとZFS、GRUB
apt install -y --no-install-recommends \
    linux-image-generic \
    linux-headers-generic \
    zfs-initramfs \
    grub-efi-amd64-signed \
    shim-signed \
    zfsutils-linux

# Xubuntuデスクトップ (標準的な構成)
apt install -y xubuntu-desktop

fstab設定

zfsは自動マウントされるが、USBスティックは自動マウントされないので/etc/fstabに書き込む

# USBパーティションのUUIDを確認(別ターミナルで実行してコピペするのが楽)
blkid /dev/sdb1
blkid /dev/sdb2

# 以下のように記述 (UUIDは上記の結果)
UUID=xxxx-xxxx  /boot/efi  vfat  umask=0077  0  0 #/dev/sdb1
UUID=yyyy-yyyy  /boot      ext4  defaults    0  0 #/dev/sdb2

GRUBのインストール

USBメモリにGRUBをインストール

# GRUB設定の更新 (ZFSを認識させる)
update-initramfs -c -k all
update-grub

# ブートローダーのインストール
# --removable はUSBメモリ等のリムーバブルメディアで起動する場合に推奨
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --removable /dev/sdb

zfsの深い階層にある/etcが見つけられないので警告が出るがこれは無視しておk

swapの設定

swap用のzvolを作成し、fstabに追記

zfs create -V 200G \
    -b $(getconf PAGESIZE) \
    -o compression=zle \
    -o logbias=throughput \
    -o sync=always \
    -o primarycache=metadata \
    -o secondarycache=none \
    -o com.sun:auto-snapshot=false \
    rpool/swap

mkswap -f /dev/zvol/rpool/swap
echo "/dev/zvol/rpool/swap none swap defaults 0 0" >> /etc/fstab

ユーザーの作成

メインユーザーを作成し、主要なグループを登録

adduser zgock
usermod -aG sudo,adm,cdrom,dip,plugdev zgock

zpoolキャッシュのコピー

chrootを抜けて、zpoolのキャッシュをchroot環境にコピーしておく。nvmeプール以外にimportしたいpoolがあるならコピー前にimportしておく

# キャッシュディレクトリがない場合は作成
mkdir -p /etc/zfs
# 念のため明示的に生成を試みるコマンド
zpool set cachefile=/etc/zfs/zpool.cache rpool

exit

cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache

アンマウントと再起動

umount -R /mnt
zpool export rpool
reboot

これでUSBメモリからブートすればraid-zをrootfsにしたxubuntuが起動するはず 念のためdf -hで確認

$df -h
nvpool/ROOT/ubuntu  815G  9.4G  806G   2% /
/dev/sdb2           7.8G  231M  7.2G   4% /boot
/dev/sdb1           511M  6.2M  505M   2% /boot/efi
nvpool              806G  128K  806G   1% /nvpool
nvpool/home         818G   13G  806G   2% /home

こんな感じになってればおk

Step2 ネットワークとKVMゲスト設定

Ethernetの有効化とブリッジ設定

debootstrapでインストールしたxubuntuだと、ethernetを自動認識していないので手動で設定

sudo vim /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: NetworkManager

NewWorkManagerで一旦自動認識してもらうためにreboot

sudo netplan apply
sudo reboot

あとはNetworkManager管轄ということでnmcliで設定してもよし、GUIで設定してもよし

今回はkvmでブリッジを使うのでnmcliからそのように設定

ブリッジで使うNICのMACアドレスをあらかじめ確認しておく(今回はenp4s0)

sudo netplan apply
# 1. 新しいブリッジインターフェース (br0) 接続を作成
nmcli con add type bridge ifname br0 con-name br0

# 2. (重要) br0 が enp4s0 のMACアドレス (xx:xx:xx:xx:xx:xx) を使うよう設定
nmcli con modify br0 ethernet.cloned-mac-address xx:xx:xx:xx:xx:xx

# 3. br0 の IPv4 と IPv6 を両方とも自動 (DHCP / SLAAC) に設定
# これにより、DHCPサーバーから固定v4アドレスとv6グローバルアドレスを受け取ります
nmcli con modify br0 ipv4.method auto ipv6.method auto

# 4. br0 に固定の ULA アドレスを追加
# ※ "+ipv6.addresses" で既存の "auto" 設定に追加します
nmcli con modify br0 +ipv6.addresses fd00:1234:5678:1::10/64

# 6. 物理インターフェース (enp4s0) を br0 のスレーブとして追加
nmcli con add type bridge-slave ifname enp4s0 master br0 con-name br0-slave-enp4s0

# 7. ブリッジ接続 (br0) をアクティベート
nmcli con up br0

KVMツールチェインのインストール

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst
sudo adduser $USER libvirt
sudo adduser $USER kvm

Windowsゲスト用zvolの構築

ベアメタル環境に合わせて2TBのC:と4TBのD:用のzvolを構築

sudo zfs create -V 2000G -o volblocksize=64K nvpool/cdrive
sudo zfs create -V 4000G -o volblocksize=64K nvpool/ddrive

volblocksize=64Kがポイント。デフォルトの16Kだとnvmeではパフォーマンスがガタ落ちする

zgock@area99:~$ sudo fio --filename=/dev/zvol/nvpool/cdrive --direct=1 --rw=read --bs=1M --ioengine=libaio --iodepth=32 --runtime=30 --numjobs=4 --time_based --group_reporting --name=benchmark-seq-read

benchmark-seq-read: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=32

...

fio-3.36

Starting 4 processes

Jobs: 4 (f=4): [R(4)][100.0%][r=9913MiB/s][r=9913 IOPS][eta 00m:00s]

benchmark-seq-read: (groupid=0, jobs=4): err= 0: pid=43774: Tue Nov 25 11:03:46 2025

  read: IOPS=12.0k, BW=11.7GiB/s (12.5GB/s)(350GiB/30013msec)

    slat (usec): min=19, max=4112, avg=91.75, stdev=95.78

    clat (usec): min=141, max=57744, avg=10607.45, stdev=3747.58

     lat (usec): min=167, max=57880, avg=10699.20, stdev=3744.43

    clat percentiles (usec):

     |  1.00th=[ 1680],  5.00th=[ 4228], 10.00th=[ 5735], 20.00th=[ 7767],

     | 30.00th=[ 8979], 40.00th=[10028], 50.00th=[10683], 60.00th=[11469],

     | 70.00th=[12256], 80.00th=[13304], 90.00th=[14877], 95.00th=[16581],

     | 99.00th=[20841], 99.50th=[22414], 99.90th=[25822], 99.95th=[26870],

     | 99.99th=[38011]

   bw (  MiB/s): min= 8644, max=17737, per=100.00%, avg=12005.25, stdev=499.60, samples=236

   iops        : min= 8644, max=17737, avg=12005.14, stdev=499.60, samples=236

  lat (usec)   : 250=0.03%, 500=0.09%, 750=0.16%, 1000=0.17%

  lat (msec)   : 2=0.94%, 4=2.96%, 10=35.50%, 20=58.69%, 50=1.46%

  lat (msec)   : 100=0.01%

  cpu          : usr=1.20%, sys=28.43%, ctx=247752, majf=0, minf=32865

  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%

     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%

     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%

     issued rwts: total=358889,0,0,0 short=0,0,0,0 dropped=0,0,0,0

     latency   : target=0, window=0, percentile=100.00%, depth=32



Run status group 0 (all jobs):

   READ: bw=11.7GiB/s (12.5GB/s), 11.7GiB/s-11.7GiB/s (12.5GB/s-12.5GB/s), io=350GiB (376GB), run=30013-30013msec

zgock@area99:~$ 

Linuxネイティブ状態であればほぼ理論値の約12GB/s出ていることを確認

Windows11の仮インストールとチューニング

windows11のisoをダウンロードしてきてvirt-managerからWindows11の仮想マシンを構築

ストレージは一旦「作成しない」を選んで、設定のカスタマイズから先ほど作成したzvolをSCSIドライブとして接続。SCSIはvirtio-scsiコントローラで

Windows11テンプレートを選べばTPMエミュレート設定までやってくれているはず

あとはネットワークに先ほど作ったbr0を指定し、virtioでネットワークを設定

libvirtのドライバディスクをFedora Projectからダウンロードしてきて、Windows11のisoとは別にセカンダリCDROMとして登録

videoはデフォルトでQXLになっているが、Windows11ではvirtio gpuドライバに変わっているのでQXLからvirtioに変更

Mem ballonはGPUパススルーをする時は邪魔になることがあるので削除を推奨

Windows11 isoからVMを起動し、インストール先の選択画面でvirtioのドライバ群(vioscsi、NetKVM、vioserial、viogpudo)をインストール

Windows11のインストールが終了したら一旦シャットダウンしてvirsh editでXML編集

Virtio SCSIコントローラにiothreadの追加。7950X3Dなら8スレッドぐらいは振ってもよい。queuesは割り当てるコア数に合わせる

    <controller type='scsi' index='0' model='virtio-scsi'>
      <driver queues='16' iothread='8'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>

VCacheが乗っているコア(CCD0)の8コア16スレッドをゲストにpinする

emulatorpinでCCD0側のコアをゲストで使用するとqemuに伝える。これでタスクマネージャーでL3キャッシュサイズが96MBになり、疑似7800X3Dになる

iothereadpinでI/Oは非VCacheコア側で行うように指定

  <vcpu placement='static'>16</vcpu>
  <iothreads>8</iothreads>
  <cputune>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='16'/>
    <vcpupin vcpu='2' cpuset='1'/>
    <vcpupin vcpu='3' cpuset='17'/>
    <vcpupin vcpu='4' cpuset='2'/>
    <vcpupin vcpu='5' cpuset='18'/>
    <vcpupin vcpu='6' cpuset='3'/>
    <vcpupin vcpu='7' cpuset='19'/>
    <vcpupin vcpu='8' cpuset='4'/>
    <vcpupin vcpu='9' cpuset='20'/>
    <vcpupin vcpu='10' cpuset='5'/>
    <vcpupin vcpu='11' cpuset='21'/>
    <vcpupin vcpu='12' cpuset='6'/>
    <vcpupin vcpu='13' cpuset='22'/>
    <vcpupin vcpu='14' cpuset='7'/>
    <vcpupin vcpu='15' cpuset='23'/>
    <emulatorpin cpuset='0-7,16-23'/>
    <iothreadpin iothread='8' cpuset='8-15,24-31'/>
  </cputune>

features等にGPUパススルーやnested VMで必要になる諸々のフラグを追加

  <features>
    <acpi/>
    <apic/>
    <hyperv mode='custom'>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
      <vendor_id state='on' value='1234567890ab'/>
      <frequencies state='on'/>
      <tlbflush state='on'/>
      <ipi state='on'/>
    </hyperv>
    <vmport state='off'/>
    <smm state='on'/>
    <ioapic driver='kvm'/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='off'>
    <topology sockets='1' dies='1' cores='8' threads='2'/>
    <cache mode='passthrough'/>
    <feature policy='require' name='topoext'/>
    <feature policy='require' name='invtsc'/>
    <feature policy='require' name='svm'/>
    <feature policy='disable' name='perfctr_core'/>
  </cpu>

これらを設定して再度Windowsを起動。PCIe5にシーケンシャルでは負けるがランダムI/OではPCIe5シングル超えするraid-z保護されたドライブになるはず

diskmark result

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment