これは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系ぐらいでさくっと組んだらええよね」と思っていたのにどうしてこうなった。
この時点では
- 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編は一応の決着
明けておちんぎんも入ったところで、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はさすがに頭おかしいぐらいに高速なので堪能はしつつも、
「俺がやりたかったのはこういうことじゃないだよなぁっ!」
と思いながらしばらく運用
そんな折、ヤフオクを覗いていたら
- 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
という構成でやっと構想どおりの環境が組めるハード環境が整う。
ハードをくみ上げ本格的にセットアップ開始。やっと今回のアドカレで書きたかった本題に入れる
ホスト側デスクトップ管理を7950X3DのiGPU、ゲストにRTX3090を当てるので UEFI biosを弄って以下のように
- iGPUを有効にし、iGPUをプライマリにする
- SVN modeとIOMMUをenableにする(後々kvmで使う)
まずは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/nvme2n1rootと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/homezfs部分をマウント後、/bootと/boot/efiにUSBスティックのブート領域をマウント
mount /dev/sdb2 /mnt/boot
mkdir -p /mnt/boot/efi
mount /dev/sdb1 /mnt/boot/efiマウント後、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/bashchroot環境では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-desktopzfsは自動マウントされるが、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/sdb2USBメモリに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/sdbzfsの深い階層にある/etcが見つけられないので警告が出るがこれは無視しておk
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 zgockchrootを抜けて、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.cacheumount -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
debootstrapでインストールしたxubuntuだと、ethernetを自動認識していないので手動で設定
sudo vim /etc/netplan/01-netcfg.yamlnetwork:
version: 2
renderer: NetworkManagerNewWorkManagerで一旦自動認識してもらうために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 br0sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst
sudo adduser $USER libvirt
sudo adduser $USER kvmベアメタル環境に合わせて2TBのC:と4TBのD:用のzvolを構築
sudo zfs create -V 2000G -o volblocksize=64K nvpool/cdrive
sudo zfs create -V 4000G -o volblocksize=64K nvpool/ddrivevolblocksize=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の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保護されたドライブになるはず


