刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

2026年夏 Flatpak版PPSSPPでまたコントローラが効かなかったので対処してみた

Ubuntu 26.04 LTS をクリーンインストールしたので、 Wayland 環境下での PPSSPP の動作はどんなものかと調べてみる事にしました。

対象は Flatpak 版の PPSSPPと、PS3 用コントローラ (HORI PAD 3 MINI) です。

Wayland セッションで controllermap の動作確認

まずは、SDL2 の controllermap です。

現在 Ubuntu 26.04 LTS での SDL2 開発用パッケージのバージョンは 2.32.10 なので、前述した記事の内容を SDL2-2.32.10.tar.gz で処理しました。

PS3 用のコントローラ (HORI PAD 3 MINI) を PC に接続し、controllermap を起動すると、正常動作します。

ボタン類のアサインを確認すると gamecontroller.txt に準拠した定義が得られます。

PPSSPP をインストール

次は Flatpak 版 PPSSPP のインストールです。
以前も予期せぬ不具合があったので少し心配です。

Flatpak のリポジトリを用意した後、PPSSPP をインストールします。

$ flatpak install org.ppsspp.PPSSPP

アイコンから PPSSPP を起動してみると、表示に乱れはありませんでした。

コントローラの動作が以前と異なる

ここで、PS3 用コントローラ (HORI PAD 3 MINI) での操作を試みると、案の定、期待通りには動作しません。

過去記事に合わせて gamecontroller.txt に前述の定義を追記したのですが、以前の様には動作しませんでした。

今までと同様に、PPSSPP がアップデートされる度に gamecontroller.txt へ定義を追記するのはやむ無し、と割り切ってたのですが、動作しないのは想定外です。

検証

ネットで調べたところ、環境変数 SDL_GAMECONTROLLERCONFIG に、件の定義を設定すれば良いとの事。

ターミナルの bash 環境で試してみます。

$ export SDL_GAMECONTROLLERCONFIG="030000000d0f00004d00000011010000,HORI CO.LTD  PAD A,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,"
$ flatpak run org.ppsspp.PPSSPP

確かに環境変数を設定すると、無事にコントローラを認識して、期待通りの動作結果を得られます。

対処

毎回ターミナルで環境変数を設定してからの起動は面倒なので、ひと手間加えます。

PPSSPP のアイコンをクリックして起動する場合、Flatseal を利用すると、簡単に環境変数を反映させる事ができます。

$ flatpak install com.github.tchx84.Flatseal

Flatseal を起動 → PPSSPP を選択 → Environment セクション「変数」の + をクリックしてSDL_GAMECONTROLLERCONFIGの設定を追加します。

後は PPSSPP のアイコンをクリックするだけで OK です。

もちろん Flatseal を使わずに直接 flatpak コマンドで設定可能なのですが、

$ flatpak override --user --env=SDL_GAMECONTROLLERCONFIG="030000000d0f00004d00000011010000,HORI CO.LTD  PAD A,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7," org.ppsspp.PPSSPP

最後のアプリケーション名を指定しないとグローバル設定になるし、コントローラの定義はとても長いので、GUI の方が確認しやすいです。

また、設定を解除する際も、--unset-env しなくてもワンクリックで消せます。

Wayland セッションでも特に問題なく動作

コントローラの認識で少し躓きましたが、Flatpak 版 PPSSPP は Wayland 環境下でも問題なく動作しました。

次は SDL3 へ移行するあたりが心配ですが、年に一度か二度しか起動しないので、しばらく様子見です。

B450 AORUS PRO WIFIでi2c-toolsを使用するなら必ずGRUBで起動オプションを設定しよう

GIGABYTE B450 AORUS PRO WIFI でメモリ周りを確認してる際、i2c バス関連で予期せぬ事態に遭遇しました。

Linux で CPU-Z のような情報を取得してみたい

Windows で動作する CPU-Z の "SPD" タブのような情報について、Linux 環境で取得する方法が知りたくて、色々と調査してました。

メモリ構成であればdmidecode --type memorylshw -class memoryでも確認できるのですが、それらは DMI テーブルの情報であって SPD の情報ではありません。

SPD にアクセスするためには i2c-tools が必要なので、まずは i2c-tools をインストールします。

$ sudo apt install i2c-tools
SMBus が認識されない (decode-dimms でエラー発生)

早速decode-dimmsでメモリの状態を確認すると、期待した結果が得られません。

$ sudo decode-dimms
No EEPROM found, try loading the eeprom, at24 or or ee1004 module

別の PC で試すと普通に動作するので、この PC 固有の問題みたいです。

モジュール不足は承知しているので、この状態のまま i2c バスの識別子を確認すると SMBus が見当たりません。

$ sudo i2cdetect -l                 
i2c-0   i2c             NVIDIA i2c adapter 4 at 6:00.0          I2C adapter
i2c-1   i2c             NVIDIA i2c adapter 6 at 6:00.0          I2C adapter
i2c-2   i2c             NVIDIA i2c adapter 7 at 6:00.0          I2C adapter

SMBus が認識されないと何もできないので、先程のエラーメッセージに従い、手動で ee1004 や i2c-smbus 等をロードしてみましたが尽く失敗します。

GRUB の起動オプションを設定

調査したところ、ACPI のリソース保護が原因のようです。

GIGABYTE 製マザーボードの場合、GRUB の起動オプションを設定して、リソース競合のチェックを緩和します。

GRUB の起動オプションは/etc/default/grubの対象行を、次のように編集して、

#GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="acpi_enforce_resources=lax"

sudo update-grubで反映しました。

....

OS を起動し、設定前後で dmesg の conflict を確認すると結果が異なります。

・起動オプションなし

$ sudo dmesg | grep -i conflict
[    4.119416] ACPI Warning: SystemIO range 0x0000000000000A45-0x0000000000000A46 conflicts with OpRegion 0x0000000000000A45-0x0000000000000A46 (\GSA1.SIO1) (20250404/utaddress-204)
[    4.119425] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[    4.425186] ACPI Warning: SystemIO range 0x0000000000000B00-0x0000000000000B08 conflicts with OpRegion 0x0000000000000B00-0x0000000000000B0F (\GSA1.SMBI) (20250404/utaddress-204)
[    4.425200] ACPI: OSL: Resource conflict; ACPI support missing from driver?

・起動オプション acpi_enforce_resources=lax

$ sudo dmesg | grep -i conflict
[    0.998658] ACPI Warning: SystemIO range 0x0000000000000A45-0x0000000000000A46 conflicts with OpRegion 0x0000000000000A45-0x0000000000000A46 (\GSA1.SIO1) (20251212/utaddress-204)
[    0.998666] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[    0.998668] ACPI: OSL: Resource conflict: System may be unstable or behave erratically
[   22.100597] ACPI Warning: SystemIO range 0x0000000000000B00-0x0000000000000B08 conflicts with OpRegion 0x0000000000000B00-0x0000000000000B0F (\GSA1.SMBI) (20251212/utaddress-204)
[   22.100617] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[   22.100620] ACPI: OSL: Resource conflict: System may be unstable or behave erratically
[   22.103284] ACPI Warning: SystemIO range 0x0000000000000B20-0x0000000000000B28 conflicts with OpRegion 0x0000000000000B20-0x0000000000000B3F (\GSA1.SMG0) (20251212/utaddress-204)
[   22.103298] ACPI: OSL: Resource conflict; ACPI support missing from driver?
[   22.103301] ACPI: OSL: Resource conflict: System may be unstable or behave erratically

※この情報は acpi_enforce_resources=no にすれば消えます。

リソース競合に関する情報が増えてますが、これらは "Warnings aren't errors. " との事なので、気にしないで先に進みます。

SMBus は認識された (しかし decode-dimms で別エラー発生)

オプション付きで Ubuntu を起動したので、まずは i2c バスの識別子を確認します。

$ sudo i2cdetect -l
i2c-0	smbus     	SMBus PIIX4 adapter port 0 at 0b00	SMBus adapter
i2c-1	smbus     	SMBus PIIX4 adapter port 2 at 0b00	SMBus adapter
i2c-2	smbus     	SMBus PIIX4 adapter port 1 at 0b20	SMBus adapter
i2c-3	i2c       	NVIDIA i2c adapter 4 at 6:00.0  	I2C adapter
i2c-4	i2c       	NVIDIA i2c adapter 6 at 6:00.0  	I2C adapter
i2c-5	i2c       	NVIDIA i2c adapter 7 at 6:00.0  	I2C adapter

今度は無事に SMBus を認識しました。

続いてdecode-dimmsでメモリの状態を確認すると、別のエラーが表示されます。

$ sudo decode-dimms
Cannot read /sys/bus/i2c/drivers/ee1004/2-0051/eeprom at /usr/bin/decode-dimms line 2455.

EEPROM にアクセスするために ee1004 モジュールはロードされているので、i2c バスからアクセス可能なデバイスと ee1004 が占有しているデバイスを確認します。

$ ls /sys/bus/i2c/devices/
0-0036  0-0052  2-0036  2-0051  i2c-1  i2c-3  i2c-5
0-0037  0-0053  2-0037  i2c-0   i2c-2  i2c-4
$ ls /sys/bus/i2c/drivers/ee1004/
0-0052  0-0053  2-0051  bind  module  uevent  unbind

何故かメモリと関係ないデバイス (2-0051) まで占有してます。

SMBus をスキャンしてみる

i2c-0 と i2c-2 の状態を確認します。

$ sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         08 -- -- -- 0c -- -- -- 
10: -- -- -- -- -- 15 -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: 30 31 -- -- 34 35 UU UU -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4f 
50: -- -- UU UU -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
$ sudo i2cdetect -y 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- UU UU -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

ここで i2c-0 の 0x50-0x53 がメモリスロットを示すのは事前に確認済みです。
デバイス識別子 0-0052, 0-0053 が現在 PC に装着している 2 枚のメモリを示します。

一方、デバイス識別子 2-0051 の詳細は不明です。

ネットで調べると "SMBus PIIX4 adapter port 1 at 0b20" はマザーボード上のオンボード LED や RGB ヘッダの制御に使われるらしいのですが、私は LED 関連に興味がないので深堀していません。※ OpenRGB 等を利用する場合は影響ありそうです。

少なくとも今回の操作には不要なデバイスなので ee1004 の占有を解除してみます。

$ ls /sys/bus/i2c/drivers/ee1004/
0-0052  0-0053  2-0051  bind  module  uevent  unbind
$ echo 2-0051 | sudo tee /sys/bus/i2c/drivers/ee1004/unbind
2-0051
$ ls /sys/bus/i2c/drivers/ee1004/
0-0052  0-0053  bind  module  uevent  unbind
$ sudo i2cdetect -y 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

i2c-2 の 0x51 の表記が占有状態を表す "UU" から "51" に変化しました。

改めてdecode-dimmsでメモリの状態を確認すると、エラーは表示されないのですが、検出されたメモリモジュール数が 0 と表示されます。

$ sudo decode-dimms
# decode-dimms version 4.4

Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others


Number of SDRAM DIMMs detected and decoded: 0

ざっとdecode-dimmsのコードを読むと、CRC の有効性確認で除外されている模様。
この場合、-cオプションで表示可能なので、ついでに--side-by-sideオプションで表示省略してみました。

$ sudo decode-dimms -c --side-by-side
# decode-dimms version 4.4

Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others


Decoding EEPROM                                  0-0052           0-0053
Guessing DIMM is in                              bank 3           bank 4
Kernel driver used                               ee1004

---=== SPD EEPROM Information ===---
EEPROM CRC of bytes 0-125                        Bad
                                                 (found 0x7851, calculated 0xD995)
# of bytes written to SDRAM EEPROM               384
Total number of bytes in EEPROM                  512
Fundamental Memory type                          DDR4 SDRAM
SPD Revision                                     1.1
Module Type                                      UDIMM
EEPROM CRC of bytes 128-253                      OK (0xA01C)

---=== Memory Characteristics ===---
Maximum module speed                             2133 MT/s (PC4-17000)
Size                                             8192 MB
Banks x Rows x Columns x Bits                    16 x 16 x 10 x 64
SDRAM Device Width                               8 bits
Ranks                                            1
Primary Bus Width                                64 bits
AA-RCD-RP-RAS (cycles)                           15-15-15-36
Supported CAS Latencies                          16T, 15T, 14T, 13T, 12T, 11T, 10T

---=== Timings at Standard Speeds ===---
AA-RCD-RP-RAS (cycles) as DDR4-2133              15-15-15-36
AA-RCD-RP-RAS (cycles) as DDR4-1866              14-14-14-31
AA-RCD-RP-RAS (cycles) as DDR4-1600              12-12-12-27

---=== Timing Parameters ===---
Minimum Cycle Time (tCKmin)                      0.938 ns
Maximum Cycle Time (tCKmax)                      1.625 ns
Minimum CAS Latency Time (tAA)                   14.070 ns
Minimum RAS to CAS Delay (tRCD)                  14.070 ns
Minimum Row Precharge Delay (tRP)                14.070 ns
Minimum Active to Precharge Delay (tRAS)         32.875 ns
Minimum Active to Auto-Refresh Delay (tRC)       46.900 ns
Minimum Recovery Delay (tRFC1)                   350.000 ns
Minimum Recovery Delay (tRFC2)                   260.000 ns
Minimum Recovery Delay (tRFC4)                   160.000 ns
Minimum Four Activate Window Delay (tFAW)        21.625 ns
Minimum Row Active to Row Active Delay (tRRD_S)  3.752 ns
Minimum Row Active to Row Active Delay (tRRD_L)  5.629 ns
Minimum CAS to CAS Delay (tCCD_L)                4.699 ns
Minimum Write Recovery Time (tWR)                15.000 ns
Minimum Write to Read Time (tWTR_S)              2.500 ns
Minimum Write to Read Time (tWTR_L)              7.500 ns

---=== Other Information ===---
Package Type                                     Monolithic
Maximum Activate Count (MAC)                     Unlimited
Post Package Repair                              One row per bank group
Soft PPR                                         Supported
Module Nominal Voltage                           Unknown
Thermal Sensor                                   No

---=== Physical Characteristics ===---
Module Height                                    32 mm
Module Thickness                                 2 mm front, 2 mm back
Module Reference Card                            A revision 1

---=== Manufacturer Data ===---
Module Manufacturer                              G Skill Intl
DRAM Manufacturer                                SK Hynix
Part Number                                      F4-3600C19-8GSXWB


Number of SDRAM DIMMs detected and decoded: 2

SPD にアスセスした結果、"EPPROM CRC of Bytes 0-125" が "Bad" と判定されましたが、概ね期待した情報を得ることができました。

結論

B450 AORUS PRO WIFI で i2c-tools を使用するなら、必ず GRUB で起動オプションを設定しよう!

lm-sensors でも同様なので、その場合も必ず GRUB で起動オプションを設定しよう!

 

おまけ

本件を調査するきっかけになった記事です。勉強になります。

Linuxを併用してWindows 11環境を別のSSDに移行する

Windows 11 25H2 のドライブに使用中の SSD を購入して 8 年くらいになります。

SSD に問題が発生した訳ではないのですが、

  • 当該 SSD より新しい SSD が余ってる
  • mbr2gpt で GPT 形式に変換したが、パーティション構成に不満がある
  • セキュアブート対策前にクローンを用意したい

等の理由から、別の SSD に Windows 11 環境を移行しました。
※ Microsoft セキュアブート証明書( 2011 年版)の期限切れ前に実施済みです。

今回の移行作業はサードパーティ製の移行ツールを利用せず、Windows 11 のインストールメディアとインストール済みの Linux 環境を併用して自力で移行してます。

すべて自己責任での SSD 移行・換装作業ですが、誰かの参考になれば幸いです。

1. 方針

現在使用中のシステムドライブを新しいデバイスに交換したい。
そんなシンプルな要望なのですが、Windows 環境で行うには面倒事が多いです。

Microsoft は標準的な OS 移行ツールを提供していません。
そのため、サードパーティ製の移行ツールを利用するか自力で行う事になります。

目指すパーティション構成

Windows の「ディスクの管理」でパーティション構成を確認します。

移行元となる SSD のパーティション構成
       
システムで予約済
549 MB
Windows11 (C:)
464.35 GB
回復パーティション
795 MB
EFIパーティション
100 MB

移行元となる SSD の Windows 11 環境は Windows 10 からアップグレードです。

当初、Windows 10 をインストールした際のデイスク形式は MBR でした。
Windows 11 へのアップグレード前に mbr2gpt で GPT 形式に変換してます。

そのまま 5 年程利用しましたが、特に支障はありません。

しかし、先頭の「システムで予約済」と称する ( MSR ではない ) 用途不明なパーティションの存在や、肝心の EFI パーティションは容量が少なく後方配置なのが気に障ります。

移行先 SSD のパーティション構成 (予定)
     
EFIパーティション
約 500 MB
Windows11 (C:)
残り最大容量
回復パーティション
約 800 MB

今回の移行では、先頭に EFI パーティションを配置し約 500MB, 末尾に回復パーティションを配置し約 800MB, 残り全てを Windows 11 用に割り当てます。

EFI パーティションの後に MSR バーティション (16MB) を作成するとクリーンインストール時のような構成になりますが、私は用意しませんでした。

作業の洗い出し

単なる移行であれば、元の SSD をそのままクローンするのが手っ取り早いです。

しかし、今回のようにパーティションの配置を変更する場合、各パーティションを目的に応じて順に処理するのが確実です。

現状確認や事前準備は別として、大まかな移行作業は次の手順になります。

  1. 移行先 SSD を GPT 形式で初期化
  2. 移行先 SSD に EFI パーティションを用意
  3. 移行先 SSD に NTFS パーティションを用意
  4. 移行元から Windows 11 環境をコピー
  5. 移行先 SSD から Windows 11 を起動できるように設定
  6. 移行先 SSD の Windows 11 領域を縮小
  7. 移行先 SSD に回復パーティションを用意
  8. 移行先 SSD の回復パーティションを有効化

これらをすべて Windows の標準機能で処理できれば良いのですが、「移行元から Windows 11 環境をコピー」はサードパーティ製ツールや Linux に頼りたいところ。

私の PC 環境にはインストール済みの Ubuntu 環境があるので、そちらを併用します。

Microsoft 製 OS なので、基本的に Windows で可能な作業は Windows 側で行い、不足や手っ取り早く済ませたい場合に Ubuntu で補う感じで進めます。

2. 現状確認

移行の際、問題になりそうな箇所を確認します。

・セキュアブートは「無効」

msinfo32コマンドで確認すると「セキュア ブートの状態」は「無効」でした。

PC で複数の OS デバイスを扱う場合、無効のまま運用した方が都合良かったのです。
※すべての移行作業を終えてから BIOS 設定で Secure Boot を「有効」にしました。

・ローカルアカウントでのログイン

私はプライベートな Microsoft アカウントを仕事で利用したくないのです。
なので、ずっとローカルアカウントでログインしています。

・BitLocker は「無効」で回復キーは不明

SSD 換装における OS 移行作業では、BitLocker 解除は必須です。
私の PC は持ち出す必要のないデスクトップ型なので、BitLocker は「無効」状態です。

ネット上の情報によると、解除していても移行作業中に回復キーを求められる可能性があるらしいのですが、これは無視する事にしました。

私はMicrosoft アカウントと紐づけてないし、BitLocker を有効にした事がないので、回復キーを要求されても困ります。

※結局のところ、移行作業中に回復キーは要求されませんでした。
もし要求された場合は、速やかに移行作業を中断して、Windows 11 をクリーンインストールするつもりでした。

・回復パーティションの状態は「有効」

Windows の「ターミナル(管理者)」で次のコマンドを実行します。

PS C:\> reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
....(省略)....
Windows RE バージョン: 10.0.26100.8737 REAGENTC.EXE: 操作は成功しました。

回復環境が Enabled なので、移行作業を円滑に進めるため、後ほど Windows 11 領域をコピーする直前に無効化します。

・システムの保護は「有効」

Windows で「システム」-関連リンク「システムの保護」を表示すると、「システムの復元」の保護設定が確認できます。

私の環境では Windows 11 のシステムドライブが「有効」になっています。

復元ポイントやシャドウコピー関連が移行作業に影響しそうでしたが、今回は特に対処しません。そのままにしておきます。

3. 事前準備

・移行作業を補助する Linux 環境を用意

私は PC にインストール済みの Ubuntu 26.04 LTS を使用します。

今回の移行作業において、Linux を利用するのはddコマンドとGPartedくらいなので、Ubuntu 等の「Linux インストール用 USB メモリ」でも代用できると思います。

・Windows 11 のインストールメディア (ESD-USB) を用意

移行作業だけであれば「Windows の回復ドライブ」でも良かったのですが、失敗したらクリーンインストールするつもりだったので、最新の「インストールメディア」を準備しました。

Microsoft 公式ページから MediaCreationTool.exe をダウンロードして、Windows 11 のインストールメディアを作成します。私は 16GB の USB メモリに書き込みました。

以降、このインストールメディアを ESD-USB と表記します。

4. 移行作業

作業開始前の PC の SSD/HDD 構成は次のとおりです。

番号 デバイス 種別 OS 用途
0 /dev/sda SATA: SSD Windows 11 25H2 移行元のディスク
1 /dev/sdb SATA: HDD Ubuntu 26.04 LTS 移行作業の補助用 OS
2 /dev/sdc SATA: SSD 不明 移行先のディスク

Windows のdiskpartコマンドで認識するディスク番号と、対応する Ubuntu 側のデバイス名を併記してあります。

手順 1. 移行先 SSD を GPT 形式で初期化

まず Ubuntu を起動します。
Gpartedで移行先ディスクのデバイスを選択して、メニュー「デバイス」-「パーティションテーブルを新規作成」を選択すると初期化できます。

※即時に反映される危険な操作なので、対象デバイスの選択に注意が必要です。

なお、 Windows で初期化する場合、この作業は不要です。
私の所有するディスクは Windows で認識しない場合もあり得るので、先に Ubuntu で初期化しました。

ここで Ubuntu を終了し、Windows 11 を起動します。

Windows の「ターミナル(管理者)」でdiskpartコマンドを実行します。

PS C:\> diskpart

Microsoft DiskPart バージョン 10.0.26100.1150

Copyright (C) Microsoft Corporation.
コンピューター: xxxxxxxxxxx

DISKPART>

接続されているディスクを確認します。

DISKPART> list disk
  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB      0 B        *
  ディスク 1    オンライン           465 GB  1024 KB        *
  ディスク 2    オンライン           465 GB   465 GB        *

GPT 列に * が表示されるものが GPT 形式のディスクです。

diskpartコマンドの場合、複数のデバイスを接続していると、どのディスクが対象か判別し難いです。
初期化した未割り当てのディスクは「サイズ」と「空き」が等しいので、私はそれを目安にしています。

diskpartコマンドの処理対象となるディスクを選択します。

DISKPART> select disk 2

ディスク 2 が選択されました。

Windows で初期化したい場合は、ここで初期化します。※私はしませんでした。

DISKPART> clean
DISKPART> convert gpt

パーティションが未定義なのを確認します。

DISKPART> list partition

このディスクには表示するパーティションがありません。
 
手順 2. 移行先 SSD に EFI パーティションを用意

選択したディスクに EFI システムパーティションを作成します。
オフセットは既定値のままです。

DISKPART> create partition efi size=500

DiskPart は指定したパーティションの作成に成功しました。

現在のパーティション情報を確認します。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
* Partition 1    システム               500 MB  1024 KB

EFI システムパーティションをフォーマットします。

DISKPART> format fs=fat32 quick label="ESP"

 100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

必要であれば MSR パーティションを作成します。※私はしませんでした。

DISKPART> create partition msr size=16
 
手順 3. 移行先 SSD に NTFS パーティションを用意

選択したディスクにプライマリパーティションを作成します。

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

現在のパーティション情報を確認します。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               500 MB  1024 KB
* Partition 2    プライマリ              465 GB   501 MB

プライマリパーティションを NTFS 形式でフォーマットします。

DISKPART> format quick fs=ntfs

 100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

diskpartコマンドを終了します。

DISKPART> exit

DiskPart を終了しています...
 
★ 手順 4 へ進む前に確認と前準備

手順 3 までの作業で移行先の SSD の準備が整いました。

移行先 SSD のパーティション構成 (手順 3 まで)
   
EFIパーティション
500 MB
NTFSパーティション
残り最大容量

手順 4 では移行元の Windows 11 環境全体をコピーするので、作業を妨げる機能や設定は、この時点で無効化します。

今回の作業では Windows 回復環境を一時的に無効化します。

Windows の「ターミナル(管理者)」で次のコマンドを実行します。

PS C:\> reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
....(省略)....
Windows RE バージョン: 10.0.26100.8737 REAGENTC.EXE: 操作は成功しました。 PS C:\> reagentc /disable REAGENTC.EXE: 操作は成功しました。 PS C:\> reagentc /info Windows 回復環境 (Windows RE) およびシステム リセット構成 情報: Windows RE の状態: Disabled Windows RE の場所: ブート構成データ (BCD) ID: 00000000-0000-0000-0000-000000000000 回復イメージの場所: 回復イメージ インデックス: 0 カスタム イメージの場所: カスタム イメージ インデックス: 0 Windows RE バージョン: 0.0.0.0 REAGENTC.EXE: 操作は成功しました。

reagentc /disableで無効化し、reagentc /infoで Windows RE の状態が Disabled になっている事を確認します。

これで移行元 SSD も準備が整いました。

手順 4. 移行元から Windows 11 環境をコピー ※ Linux での作業

Windows を終了し、Ubuntu を起動します。

ターミナルを起動し、移行元ディスクの Windows 11 環境のパーティションを移行先ディスクの NTFS パーティションに上書きコピーします。

※指定を誤るとデータが消失する危険な操作なので、移行元・移行先のパーティション指定に注意が必要です。

直前にlsblk, fdisk -lGparted等でパーティション情報を再確認します。

私の環境では移行元 (/dev/sda2) から移行先 (/dev/sdc2) へのコピーになるので、次のコマンドで処理しました。

$ sudo dd if=/dev/sda2 of=/dev/sdc2 bs=4M conv=sync,noerror status=progress

コピーに要した時間は約 40 分。特にエラーは発生せず無事に完了しました。

Ubuntu をシャットダウンし、PC から不要なデバイスを外します。

★ 手順 5 へ進む前に確認と前準備

手順 4 の作業で移行先の SSD に Windows 11 環境をコピーしました。
残念ながらコピーしただけでは Windows は起動しません。

移行先 SSD のパーティション構成 (手順 4 まで)
   
EFIパーティション
500 MB
Windows 11 環境のコピー
残り最大容量

手順 5 ではコピーした Windows 11 を起動できるように、EFI システムパーティションへ情報を登録します。

その前に PC から不要なデバイスを外しておきます。

番号 デバイス 種別 OS 用途
0 /dev/sda SATA: SSD なし (Windows のコピー) 移行先のディスク

このままでは OS を起動できないので、インストールメディアである ESD-USB を USB ポートに接続します。

私の環境では「UEFI: GH PicoDriveL3 PMAP, Partition 1」と認識します。

手順 5. 移行先 SSD から Windows 11 を起動できるように設定 ※ ESD-USB 起動での作業

PC の電源を ON にし、Boot Menu から ESD-USB を選択すると、起動シーケンスの後、「Windows 11 セットアップ」のウィンドウが表示されます。

ここで、Shift + F10キーを押下して管理者用のコマンドプロンプトを起動します。
以降の作業は、このコマンドプロンプトを用いて行います。

※スクリーンショットを撮れなかったので、作業のメモを貼り付けておきます。

コマンドプロンプトでdiskpartコマンドを実行します。

X:¥sources>diskpart

Microsoft DiskPart バージョン 10.0.26100.1150

Copyright (C) Microsoft Corporation.
コンピューター: MININT-N5U3SHN

DISKPART>

現在 Windows 11 セットアップが認識しているボリュームを確認します。

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0     C   Windows11    NTFS   Partition    464 GB  正常         
  Volume 1         ESP          FAT32  Partition    500 MB  正常         非表示
  Volume 2     D   ESD-USB      FAT32  リムーバブル        32 GB  正常

私の環境では、移行元で付けていたボリュームラベル "Windows11" とドライブ文字 "C" が既に割り当て済みでした。

続く作業には EFI パーティション (ESP) にもドライブ文字が必要です。
ディスクの一覧を確認して、ディスク 0 の ESP にドライブ文字 "W" を割り当てます。

※一部情報を省略しています。

DISKPART> list disk
DISKPART> select disk 0
DISKPART> list partition
DISKPART> select partition 1
DISKPART> list partition
 ....(Patition 1 システム に * が付く)....
DISKPART> assign letter=W

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0     C   Windows11    NTFS   Partition    464 GB  正常         
* Volume 1     W   ESP          FAT32  Partition    500 MB  正常         非表示
  Volume 2     D   ESD-USB      FAT32  リムーバブル        32 GB  正常

ドライブ文字を確認したらdiskpartコマンドを終了します。

DISKPART> exit

DiskPart を終了しています...

X:¥sources>

次に PC の全ディスクからインストール済みの Windows 環境を探します。

X:¥sources>bootrec /scanos
Windows インストールを、すべてのディスクをスキャンして検出しています・

これには、しばらく時間がかかります。お待ちください...

Windows のインストールのスキャンは成功しました。
Windows のインストールとして認識された合計数: 1
[1]  C:¥Windows
操作は正常に終了しました。

この環境のブート情報を EFI システムパーティションに登録します。

X:¥sources>bcdboot C:¥Windows /s W: /f UEFI
ブート ファイルは正常に作成されました。

## C:Windows だと...
## BFSVC Error: Could not open the BCD template store. Status = [c0000000f]

これで Windows を起動する準備ができました。

最後にdiskpartコマンドで不要なドライブ文字 "W"を削除して、コマンドプロンプトも終了します。

※一部情報を省略しています。

X:¥sources>diskpart
DISKPART> list volume
DISKPART> select volume 1
DISKPART> list volume
....(Volume 1 に * が付く).... DISKPART> remove letter=W DiskPart はドライブ文字またはマウント ポイントを正常に削除しました。 DISKPART> list volume DISKPART> exit X:¥sources>exit

これでインストールメディアでの作業は終了です。

「Windows 11 セットアップ」ウィンドウを閉じて、「本当に終了しますか?」の問いに「はい」をクリックすると PC が再起動します。

★ 手順 6 へ進む前に確認

手順 5 の作業で改めて Windows が起動できるようになりました。

移行先 SSD のパーティション構成 (手順 5 まで)
   
EFIパーティション
500 MB
Windows11 (C:)
残り最大容量

ESD-USB を外して、以前のように Windows 11 が起動すれば、移行作業は成功です。

後は回復パーティションを再作成するだけです。

私は一旦 Windows 11 環境で Windows Update や諸々の確認作業を済ませてます。
その後、改めて ESD-USB を接続して、回復パーティションを作成しました。

わさわざ ESD-USB を利用しなくても、通常の Windows で作業できる内容です。

私は PC のデバイスを元に戻した際、Ubuntu の起動確認ついでにGpartedで Windows 11 環境の領域を縮小したため、CHKDSKコマンドでディスクのエラー確認をしたくて ESD-USB 起動にしました。

本件とは関係ないので、以降は通常の Windows 環境での作業内容を記します。

手順 6. 移行先 SSD の Windows 11 領域を縮小

まず Windows 11 環境の縮小可能サイズを確認します。

Windows の「ターミナル(管理者)」でdiskpartコマンドを実行します。
shrink querymaxは処理に時間を要するので、しばらく放置します。

PS C:\> diskpart

Microsoft DiskPart バージョン 10.0.26100.1150

Copyright (C) Microsoft Corporation.
コンピューター: xxxxxxxxxxx

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0     C   Windows11    NTFS   Partition    465 GB  正常         ブート
  Volume 1         ESP          FAT32  Partition    500 MB  正常         システム

DISKPART> select volume 0

ボリューム 0 が選択されました。

DISKPART> shrink querymax

再利用できる最大のバイト数は次のとおりです。  139 GB (142395 MB)

縮小可能であれば、800 MB だけ縮小します。

DISKPART> shrink desired=800

ボリュームは、次の方法で正常に縮小されました:  800 MB

これでディスクの末尾に 800MB の未割り当て領域を用意できました。

手順 7. 移行先 SSD に回復パーティションを用意

続いて回復パーティションを確保します。

プライマリパーティションとして領域確保し、NTFS 形式でフォーマットする際、ボリュームラベルを "Recovery"にします。
特殊なパーティション ID と属性を付与すると、回復パーティションとして扱われます。

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               500 MB  1024 KB
  Partition 2    プライマリ              464 GB   501 MB

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               500 MB  1024 KB
  Partition 2    プライマリ              464 GB   501 MB
* Partition 3    プライマリ              800 MB   464 GB

DISKPART> format quick fs=ntfs label=Recovery

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

DISKPART> set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac

DiskPart は、パーティション ID を設定しました。

DISKPART> gpt attributes=0x8000000000000001

選択された GPT パーティションに DiskPart で属性を割り当てました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               500 MB  1024 KB
  Partition 2    プライマリ              464 GB   501 MB
* Partition 3    回復                 800 MB   464 GB

念のため、ここで Windows を再起動しました。

手順 8. 移行先 SSD の回復パーティションを有効化

最後に Windows 回復環境を有効化します。

Windows の「ターミナル(管理者)」で次のコマンドを実行します。

PS C:\> reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Disabled
    Windows RE の場所:
    ブート構成データ (BCD) ID: 00000000-0000-0000-0000-000000000000
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム イメージの場所:
    カスタム イメージ インデックス: 0
    Windows RE バージョン:        0.0.0.0

REAGENTC.EXE: 操作は成功しました。

PS C:\> reagentc /enable
REAGENTC.EXE: 操作は成功しました。

PS C:\> reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
....(省略)....
Windows RE バージョン: 10.0.26100.8737 REAGENTC.EXE: 操作は成功しました。

reagentc /enableで有効化し、reagentc /infoで Windows RE の状態が Enabled になっている事を確認します。

これですべての作業が終了しました。

 

5. 所感

移行後、1ヶ月経過しましたが、特に問題は発生してません。
ライセンス認証の要求はなく、以前のまま変わりなく使用しています。

結局は、単に SSD を換装しただけなのですが、移行作業を順を追って記録すると、かなりの量になりますね。

今回の件とは関係ないのですが、無事にセキュアブートも有効化できてます。

私は自力で済ませましたが、今どきのサードパーティ製ツールなら、面倒事の解決も含め、細かいところまで配慮してくれるのでしょうか。

もうしばらく今の PC を使い続ける事になりそうなので、NVMe への換装もあるかもしれません。

モニター用のスクリーンバーライトをつけたら目が楽になった

昨年末に、プリンストン スクリーンバーライトを購入して、一年経過しました。

夕暮れ時や薄暗く感じるけど照明をつけるまでではない時。
スクリーンバーライトでモニター前や手元を明るく照らすと、目がとても楽です。

一度経験してしまうと、もう手放せません。
毎日使用できないと困ります。

きっかけは部屋の模様替え

部屋の模様替えにより、室内照明の光がモニターの裏から当たるようになりました。
昼間はともかく、夕方以降は手元が薄暗くなります。

それまで気にした事はなかったのですが、手元が暗いとモニターの光を強く感じます。
目の疲労感も半端なく、モニターを見続けるのが辛い日もありました。

読書用の照明スタンドを使ってみましたが、手元を明るくするとモニターに光が差し込み、かえって見づらい状態になります。

とりあえずお試しで購入してみた

ネットで調べたら、モニター用ライトというジャンルがあり、目に良いとのこと。
しかし、私は利用した経験がないので、その有用性がわかりません。

モニターと同じ BenQ ScreenBar シリーズは初めて購入するには少々高額で、もし合わなかったら後悔しそうです。

一万円以下で評判の良さそうなものを探すと、プリンストン製のスクリーンバーライト (PMA-SCBAR) が目に留まりました。

値段も手頃だったので、失敗してもいいかな程度の気持ちで購入を決めました。

取り付けはモニターを選ぶ

購入して改めて気づいた点がいくつかあります。

  • モニターの前面に引っ掛けるツメが 8mm 程度
  • モニターの背面から押さえるバーがフラット
  • USB ケーブル給電のため、単独使用には別途アダプタ(5V/1A) が必要
  • USB ケーブルは 150 cm

まず、モニターの形状によって設置できない場合があります。
仕様書には、モニターベゼル幅 5 ~ 55mm との記載があります。

私は元々 BenQ PD2700Q に乗せるつもりで購入しました。
PD2700Q は前面に額縁状のベゼルがあり、背面もフラットなので問題ありません。

一方で EW2880U はベゼル部分がなく、背面はゆるく湾曲してます。
乗せられるものの安定感は今ひとつ。
引っ掛けるツメがモニターを傷つけそうで怖いです。

そもそもモニターアームなので、USB 給電ケーブルを給電元から十分に届かせる必要があり、現実的ではありません。

USB 電源アダプタでいつでも利用可

私は PC を利用していない時でも照明スタンド代りに手元を明るくしたいです。

説明書には「USB 給電 (5V) ※ 1A 以上出力可能な USB ポートへ接続してください」と記載されています。

手持ちの USB 電源アダプタでは、Apple USB 電源アダプタの 5W タイプが仕様を満たしてます。機種変更の度に余りがちなので、ちょうど良かったです。

実際に USB 給電元として使用したところ、特に問題ありません。

使用感は良好

気まぐれのお試しで購入したスクリーンバーライトですが使用感は良好です。
いつでもワンタッチで手元を明るくできます。

色々設定できますが、私は面倒なのであまり変更してません。
光度は白色 (3800K) で固定し、輝度は控えめで落ち着きました。

モヤモヤする事もある

輝度を控えめと書いたのは、私には明る過ぎたからです。
購入直後は明るさに驚き、輝度を最小以外に設定したくない思いでした。

ところが、使い始めて 3ヶ月程のこと。
突然バーライトの LED が激しく明滅するようになりました。
接触不良、ケーブル不良、アダプタ故障等を疑いましたが解決しません。

試しに設定変更で輝度を一段明るくしたところ、いきなり安定しました。
その後も最小設定のみ不具合を生じてたのですが、なぜか最近は問題ありません。
モヤモヤします。

モニター用ライトは良い買物だった

冒頭にも記述しましたが、本当に目が楽です。

私は眼精疲労や頭痛が減って助かってます。
正直なところ舐めてました。

あまりに快適で、私にとってモニター用ライトは必需品になりました。

そうなると高級品というか高いグレードの製品にも興味が湧きます。
次は BenQ ScreenBar モニターライトにするかもしれません。

BenQ EW2880Uにエルゴトロン LXデスクモニターアームを付けたら快適だった

昨年末に、エルゴトロン LX デスクモニターアームを購入して、一年経過しました。

現在は BenQ EW2880U に取り付けて、無印良品の木製折りたたみテーブルに固定し、快適な作業環境を確保できてます。

購入前の状態

以前はテーブルにBenQ EW2880U を単独で置いてました。

諸事情により部屋の模様替えが必要になり、機材レイアウトや配線も変更する事に。
その結果、BenQ PD2700Q も同じテーブルに置かないと収まりません。

実際に幅 120 cm x 奥行 70 cm のテーブルに両方置いてみると、少しハミ出ます。
PD2700Q を縦置きにすればピッタリなのですが、作業に支障をきたすので却下です。

なんとか配置を工夫してみたのですが、どうにも EW2880U の融通が効きません。
付属のモニタースタンドの足が V 字型で作業スペースを減らしてしまうのが難点です。

一方、PD2700Q は左右に角度調整・上下移動可。テーブルを塞ぐ範囲も少ないです。
PD2700Q 付属のモニタースタンドが如何に便利か良く分かりました。

エルゴトロン LX デスクモニターアームを購入

不便さを解消しつつ、作業スペースを確保するために、エルゴトロン LX デスクモニターアームを購入しました。

EW2880U 購入直後に候補として検討し、買うならコレと決めてました。
その最大の理由はアームがぶれない・下がってこないと評価されている点です。

確かに固い

実際に EW2880U に取り付けるとネットの情報通りアームが固めでした。

最初に動かそうとすると EW2880U のマウント部分が割れそうで心配になります。
そんな固さでしたが、テコの原理で少し押したらすんなり動き出しました。

一旦動いてしまえば、後は驚くほどスムーズに動作します。
私が購入した個体では一切調整不要でした。

テーブルの天板が心配

モニターアームをテーブルに固定する際、テーブルの天板の強度が心配です。

固定すると EW2880U (5.29kg) + LX (3.6kg) の重量が天板の一点に集中します。 
厚さ 1cm のラックに仮止めしたら、翌日には歪んでたので、無視はできません。

テーブルの天板はオーク材を加工したもので、厚さは 2.5cm です。
強度はそこそこありますが、念の為、エレコム製の取付補強プレート DPA-RP01BK を間に挟んで固定しました。

テーブルの足が心配

テーブル全体及び天板の対荷重は約 20kg です。

EW2880U と PD2700Q を合わせると約 16kg なので、小物類をまとめて約 1kg とすると、残りは約 3kg 程度の余裕しかありません。

そして、テーブルの足は金属製のパイプ状でボルト留めされてます。

配置した後に軽くゆすってみましたが、ぐらぐら揺れたりはしません。
PC 用の机ではないので、しばらく使用してどうなるか確認が必要です。

ちなみにテーブル自体の重量は約 16.5kg なので、部屋の床も心配だったりします。

一年経ちましたが快適です

エルゴトロン LX デスクモニターアームは噂に違わず安定してます。

EW2880U を固定位置からほぼ動かさずに過ごしましたが、少しもブレがありません。
隣に置いた PD2700Q との位置合わせをしてから、まったく変化してません。

テーブルの天板も歪みはなくフラットな状態です。
テーブルの足は一回ボルトの緩みを締め直したくらいで問題ありません。

....

不謹慎な話ですが、今年初めの地震で我が家も壁に亀裂が走り、配管が一本折れるくらいのダメージを受けました。

そんな揺れの中、テーブル上の小物や PD2700Q が動いても、EW2880U に取り付けたエルゴトロン LX デスクモニターアームは固定位置から微動だにしません。
テーブルごと揺れてるのに変化がないなんて、ちょっと感動しました。

不満といえばテーブルクロス

一年経って、最も困ったのはテーブルクロスを普通にかけられない事です。
テーブルに固定したので、当然ですが固定部が邪魔になります。

私はテーブルクロスをかけたい派なので、ビニール製のテーブルクロスに切れ目を入れて対応しました。

普通にテーブルクロスをかけるなら、別途マウント用のサイドテーブルを用意するか、壁固定にするかです。
ランチョンマット的なものを試してみたけど、掃除が面倒でやめました。

モニター購入の判断は正しかったか

今回は後からモニターアームを追加購入しました。
私の用途ではモニターを頻繁に動かす事はほぼないのにです。

結局 EW2880U を購入しましたが、PD2705U も候補の一つでした。
掛かった費用を合計すると、PD2705U より EW2880U の方が高くつきました。

PD シリーズにはない特長や良い点もあり、EW2880U の購入自体は後悔してません。
そして、モニターアームが優秀なのも間違いありません。

一方で、PD シリーズ付属のモニタースタンドの仕様であれば、角度も位置も問題なく、作業スペースも確保できます。
多少高額でも PD2705U にすれば良かったのかもしれません。

一概には言えませんが、今後の指針のひとつに加えたいと思います。

B450とRyzen 7 5700Xとメモリの妙な話

B450 マザーボードRyzen 7 5700X を載せた PC での話です。
手持ちのメモリは DDR4-3600 なのですが、3200MHz で動作させています。

CPU AMD Ryzen 7 5700X (Zen3)
M/B GIGABYTE B450 AORUS PRO WIFI (BIOS: F65 / AMD AGESA V2 1.2.0.B)
GPU NVIDIA GeForce GTX 1050 Ti
Mem G.Skill F4-3600C19D-16GSXWB (CL19-20-20-40) 8GB x 2 枚
A: DDR4_2, B: DDR4_1 に装着し、Dual Channel で動作
AMD CPU では CL20 。定格に合わせて 3200MHz 1.200V 駆動


さて、この PC の Linux 環境でビルド時間が 1 分を超えるプロジェクトがあります。

このプロジェクトでは 850 個以上のオブジェクトファイルが生成されます。
なので、ビルド時間が長いのは仕方ないです。

ですが、手持ちのメモリモジュールは OC メモリだけど DDR4-3600 です。
現在の動作クロックは 3200MHz ですが、3600MHz 運用を試したくなりました。

これで少しでもビルド時間を短縮できれば嬉しい限りです。

ところが 3200MHz の方が 3600MHz よりビルド時間が短い

そんな事を期待しつつ、3200MHz と 3600MHz でビルド時間を比較したところ、

■ 3200MHz (CL20-20-20-40) 1.20V 動作時
ninja  996.76s user 51.36s system 1359% cpu 1:17.10 total
ninja  1000.24s user 51.15s system 1379% cpu 1:16.22 total
ninja  994.60s user 51.09s system 1354% cpu 1:17.20 total
■ 3600MHz (CL20-20-20-40) 1.35V 動作時
ninja  1029.85s user 52.66s system 1358% cpu 1:19.70 total
ninja  1030.50s user 52.56s system 1383% cpu 1:18.30 total
ninja  1029.95s user 52.79s system 1385% cpu 1:18.15 total

残念ながら期待した結果になってません。

想定とは逆に 3200MHz 動作の方が数秒短い時間で完了しています。
しかも同じレイテンシ (CL20) なのにです。

メモリクロックを上げると同一時間内でのデータ転送量が増えるのに

私の想定では、メモリクロックを上げるとメモリ帯域幅が広くなり、結果として全体性能が向上するはずでした。

判断基準が崩れたので、まずはメモリ帯域幅を調査してみます。
Linux では STREAM でメモリ帯域幅を計測できるそうです。

(1) STREAM をビルド

公式サイトの "Source Code Directory" からソースコードを入手するのが正規ルートとは思いますが、私は GitHub から入手しました。

$ mkdir temp
$ cd temp
$ git clone https://github.com/jeffhammond/STREAM.git
$ cd STREAM
$ gcc -O2 -fopenmp stream.c -o stream_openmp

カレントディレクトリにstream_openmpが生成されます。

(2) STREAM の設定と実行

スレッド数を 96 に設定してからコマンドを実行します。

$ export OMP_NUM_THREADS=96
$ ./stream_openmp
 
(3) 実行結果

・3200MHz 動作

-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 96
Number of Threads counted = 96
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 8125 microseconds.
   (= 8125 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           16474.5     0.009888     0.009712     0.010094
Scale:          14672.5     0.011006     0.010905     0.011305
Add:            17845.3     0.013601     0.013449     0.013752
Triad:          16950.4     0.014359     0.014159     0.015236
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------

・3600MHz 動作

-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 96
Number of Threads counted = 96
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 7064 microseconds.
   (= 7064 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           18774.9     0.008623     0.008522     0.008733
Scale:          16792.7     0.009668     0.009528     0.009716
Add:            19619.0     0.012304     0.012233     0.012494
Triad:          18706.5     0.012943     0.012830     0.013301
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------

STREAM の実行結果から 3600MHz の方がメモリ帯域幅が広い事が確認できます。

これは期待通りの結果です。
実行する度に結果は変動しますが、傾向は同じでした。

他のベンチマークで計測してみる

メモリ帯域幅が広いのにビルド時間が遅くなる理由がわかりません。

そこで Linux でシステム全体のベンチマークを計測できるものを探したところ、PassMark Software 製のPerformanceTest Linuxを見つけました。

後述する内容は Ubuntu 24.04.1 LTS で実行した結果です。

(1) PerformanceTest Linux を取得・展開・実行

サイトから PerformanceTest Linux x86 64-bit をダウンロードして展開します。

$ wget https://www.passmark.com/downloads/PerformanceTest_Linux_x86-64.zip
$ unzip ./PerformanceTest_Linux_x86-64.zip 
Archive:  ./PerformanceTest_Linux_x86-64.zip
   creating: PerformanceTest/
  inflating: PerformanceTest/readme.txt  
  inflating: PerformanceTest/pt_linux_x64

展開後はpt_linux_x64を実行するだけです。

しかし、私の環境では共有ライブラリが不足しているのでエラーが発生します。

$ ./PerformanceTest/pt_linux_x64 
./PerformanceTest/pt_linux_x64: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

Ubuntu 24.04.1 LTS では ncurses 系のバージョンは 6.4 で既にインストール済みです。

このままでは実行できないので、対象バージョンの共有ライブラリを手動で処理します。

$ wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2_amd64.deb
$ sudo dpkg -i libtinfo5_6.3-2_amd64.deb
$ wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2_amd64.deb
$ sudo dpkg -i libncurses5_6.3-2_amd64.deb

共有ライブラリの依存関係により、libtinfo5, libncurses5 の順にインストールします。
/usr/lib/x86_64-linux-gnu/ にそれぞれ lib*.so.5.9 なライブラリが存在するはずです。

(2) 実行結果

・3200MHz 動作

                   PassMark PerformanceTest Linux (11.0.1002)


AMD Ryzen 7 5700X 8-Core Processor (x86_64)
8 cores @ 4661 MHz  |  15.5 GiB RAM
Number of Processes: 16  |  Test Iterations: 1  |  Test Duration: Medium
--------------------------------------------------------------------------------
CPU Mark:                          26223
  Integer Math                     94430 Million Operations/s
  Floating Point Math              51557 Million Operations/s
  Prime Numbers                    108 Million Primes/s
  Sorting                          34499 Thousand Strings/s
  Encryption                       22772 MB/s
  Compression                      321855 KB/s
  CPU Single Threaded              3435 Million Operations/s
  Physics                          1206 Frames/s
  Extended Instructions (SSE)      17835 Million Matrices/s

Memory Mark:                       3252
  Database Operations              7185 Thousand Operations/s
  Memory Read Cached               35227 MB/s
  Memory Read Uncached             24495 MB/s
  Memory Write                     15995 MB/s
  Available RAM                    13484 Megabytes
  Memory Latency                   45 Nanoseconds
  Memory Threaded                  43501 MB/s
--------------------------------------------------------------------------------

Results not submitted
Upload results to cpubenchmark.net? [Y/n]:

Use ESC or CTRL-C to exit
A: Run All Tests   C: Run CPU Tests   M: Run Memory Tests   U: Upload Test Resul

・3600MHz 動作

                   PassMark PerformanceTest Linux (11.0.1002)


AMD Ryzen 7 5700X 8-Core Processor (x86_64)
8 cores @ 4661 MHz  |  15.5 GiB RAM
Number of Processes: 16  |  Test Iterations: 1  |  Test Duration: Medium
--------------------------------------------------------------------------------
CPU Mark:                          26005
  Integer Math                     92589 Million Operations/s
  Floating Point Math              50726 Million Operations/s
  Prime Numbers                    116 Million Primes/s
  Sorting                          34921 Thousand Strings/s
  Encryption                       21970 MB/s
  Compression                      306954 KB/s
  CPU Single Threaded              3436 Million Operations/s
  Physics                          1303 Frames/s
  Extended Instructions (SSE)      17248 Million Matrices/s

Memory Mark:                       3451
  Database Operations              7666 Thousand Operations/s
  Memory Read Cached               35225 MB/s
  Memory Read Uncached             25905 MB/s
  Memory Write                     17867 MB/s
  Available RAM                    13493 Megabytes
  Memory Latency                   41 Nanoseconds
  Memory Threaded                  47419 MB/s
--------------------------------------------------------------------------------

Results not submitted
Upload results to cpubenchmark.net? [Y/n]:

Use ESC or CTRL-C to exit
A: Run All Tests   C: Run CPU Tests   M: Run Memory Tests   U: Upload Test Resul

実行結果によると、Memory Mark では 3600MHz の方が 3200MHz より高い数値ですが、CPU Mark では逆転してます。

何度実行しても傾向は変わりません。
僅かな差ですが CPU の処理性能が落ちてる事が確認できます。

結局、メモリ設定は 3200MHz に戻した

私の場合、Linux 環境でビルド時間を短縮できないなら本末転倒です。
いくらベンチマークテストで傾向を調べても、ビルドの実行結果がすべてです。

その後、ビルド時間を短縮できるように、BIOS 画面から

  • CPU Clock Control
  • CPU Clock Ratio
  • System Memory Multiplier
  • Standard Timing Control
  • Advanced Timing Control
  • DRAM Voltage

等の設定値を変更して、組み合わせを色々と試しましたが、結果は芳しくありません。
なので、3600MHz ではなく 3200MHz 設定に戻しました。

また、3200MHz でも CAS Latency 等を詰めてみたのですが、時間短縮は数 ms 程度だったので、無理はせず CL20-20-20-40 のままにしました。

私の用途では当初の設定値が適切だったみたいです。
というか、この程度だとあまり利点はないので、元の状態で妥協します。

根本的に何か間違った事をしてなければ良いのですが...

自分用メモ

・気になる点

  • FSB:DRAM は 1:16 (3200MHz), 3:54 (3600MHz) 
  • B450 の SATASSD/HDD を接続しているから?NVMeでは?
  • Zen3 世代の CPU なので X570, B550 チップセットでは?
  • もし APU だったら?
  • 別のメモリモジュールだったら?
  • 関係ないけど Windows では?

 等々

・現在の BIOS 設定

M.I.T.
Advanced Frequency Settings
CPU Clock Control Auto (既定値)
Host Clock Value の表示は 100.00MHz
CPU Ratio Mode All cores (既定値)
CPU Clock Ratio Auto (既定値)
CPU Frequency の表示は 3.40GHz
Advanced Frequency Settings - Advanced CPU Settings
SVM Mode Enabled
Advanced Memory Settings
Extream Memory Profile(X.M.P.) Profile1
DDR4-3600 19-20-20-40-60-1.35V
System Memory Multiplier 32.00
Memory Frequency(MHz) の表示は 3200MHz
Memory Timing Mode Auto (既定値)
Advanced Voltage Settings
Dynamic Vcore(DVID) Auto (既定値)
Dynamic VCORE SOC(DVID) Auto (既定値)
DRAM Voltage (CH A/B) 1.200V
BIOS
<UEFI> CSM Support Enabled (既定値)
Peripherals
AMD CPU fTPM Enabled (既定値)

 

・メモリの設定値

DDR4-3200 CL18-18-18-38-56-1T 1.2V 動作まで確認済み

暇ができたら DRAM Calculator for Ryzen 等を利用して、もう少し詰めてみる

B450 AORUS PRO WIFIでsensorsの出力結果のラベルを変更する

以前、Linux でハードウェアの温度を取得するにあたり、こんな記事を書きました。

先日 PC の CPU を換装したので、改めて sensors を実行したところ、今までと同様に期待通りの出力結果が得られてます。

sensors の出力結果のはてな

実はずっと気になってた事があります。

it87 ドライバをロードして sensors の出力結果を見ると、

$ sensors

....(ざっくり省略)....

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +39.8°C  
Tccd1:        +38.5°C  

it8686-isa-0a40
Adapter: ISA adapter
in0:           960.00 mV (min =  +0.00 V, max =  +3.06 V)
in1:             2.02 V  (min =  +0.00 V, max =  +3.06 V)
in2:             2.00 V  (min =  +0.00 V, max =  +3.06 V)
in3:             2.02 V  (min =  +0.00 V, max =  +3.06 V)
in4:           996.00 mV (min =  +0.00 V, max =  +3.06 V)
in5:           900.00 mV (min =  +0.00 V, max =  +3.06 V)
in6:             1.36 V  (min =  +0.00 V, max =  +3.06 V)
3VSB:            3.26 V  (min =  +0.00 V, max =  +6.12 V)
Vbat:            3.05 V  
fan1:           475 RPM  (min =    0 RPM)
fan2:             0 RPM  (min =    0 RPM)
fan3:             0 RPM  (min =    0 RPM)
fan4:             0 RPM  (min =    0 RPM)
fan5:             0 RPM  (min =    0 RPM)
temp1:          +26.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp2:          +30.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp3:          +39.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = AMD AMDSI
temp4:          +29.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp5:          +36.0°C  (low  =  +0.0°C, high = -120.0°C)  sensor = thermistor
temp6:          +41.0°C  (low  =  +0.0°C, high = -120.0°C)  sensor = thermistor
intrusion0:    ALARM

センサーから取得した温度が temp1 〜 temp6 のように表現されていますが、この値が何を指すのかよくわかりません。

BIOS 画面での温度表現は

BIOS 画面の「 M.I.T. 」メニューから「 Smart Fan 5 」を選択すると、画面の右下に次のような 6 種類の温度が表示されます。

🌡 CPU 41.0℃ 🌡 System 1 27.0℃
🌡 Chipset 31.0℃ 🌡 PCIEX16 30.0℃
🌡 VRM MOS 34.0℃ 🌡 VSOC MOS 39.0℃

前述の temp1 〜 temp6 はこれらを指すと類推して、適度に負荷をかけつつ、sensors と BIOS 画面の値の変動を見てると、それなりに傾向が分かります。

BIOS 画面のセンサーと sensors の対応表

そして、私なりに導出した結果がこちらです。

CPU temp3 System 1 temp1
Chipset temp2 PCIEX16 temp4
VRM MOS temp5 VSOC MOS temp6

私の勝手な決めつけなので、誤ってるかもしれません。
何処かに正規の対応表が存在するなら、ぜひ教えて欲しいです。

sensors の出力結果のラベルを変更

この対応表が正しいとして、sensors から出力される temp1 〜 temp6 の表記を変更してみます。

エディタ類で/etc/sensors.d/Gigabyte-B450-AORUS-PRO-WIFIというファイルを用意し、次の内容を記述します。

chip "it8686-isa-0a40"
  label temp1 "System1 Temp"
  label temp2 "Chipset Temp"
  label temp3 "CPU Temp"
  label temp4 "PCIEX16 Temp"
  label temp5 "VRM MOS Temp"
  label temp6 "VSOC MOS Temp"

ここでは、it87 ドライバで認識される "it8686-isa-0a40" の出力結果の内、 temp1 〜 temp6 の各ラベルを文字列で指定しています。

そして、sensors を実行すると、

$ sensors

....(ざっくり省略)....

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +47.6°C  
Tccd1:        +42.8°C  

it8686-isa-0a40
Adapter: ISA adapter
in0:           960.00 mV (min =  +0.00 V, max =  +3.06 V)
in1:             2.02 V  (min =  +0.00 V, max =  +3.06 V)
in2:             2.00 V  (min =  +0.00 V, max =  +3.06 V)
in3:             2.02 V  (min =  +0.00 V, max =  +3.06 V)
in4:           996.00 mV (min =  +0.00 V, max =  +3.06 V)
in5:           900.00 mV (min =  +0.00 V, max =  +3.06 V)
in6:             1.36 V  (min =  +0.00 V, max =  +3.06 V)
3VSB:            3.26 V  (min =  +0.00 V, max =  +6.12 V)
Vbat:            3.05 V  
fan1:           544 RPM  (min =    0 RPM)
fan2:             0 RPM  (min =    0 RPM)
fan3:             0 RPM  (min =    0 RPM)
fan4:             0 RPM  (min =    0 RPM)
fan5:             0 RPM  (min =    0 RPM)
System1 Temp:   +28.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
Chipset Temp:   +32.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
CPU Temp:       +49.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = AMD AMDSI
PCIEX16 Temp:   +31.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
VRM MOS Temp:   +39.0°C  (low  =  +0.0°C, high = -120.0°C)  sensor = thermistor
VSOC MOS Temp:  +45.0°C  (low  =  +0.0°C, high = -120.0°C)  sensor = thermistor
intrusion0:    ALARM

無事、ラベルの表記を変更する事ができました。