Steam DeckのSSDをMP600 MINIに換装

SSDの交換は保証外となるので十分ご注意を。

交換手順については、既に色々なサイトに掲載されているのでそちらを参照で。

Steam DeckのSSDをCORSAIRのMP600 MINIに換装した。

最初のうちはSDカードでいいじゃんって思ってたけど、やっぱり内蔵SSDとの性能差が明らかにあるし、Windowsとのデュアルブートもしていて容量が足りなくなったので。

Amazonで15,669円で購入。取り寄せになってたけど1週間とちょっとで届いてラッキーだった!
アフィリエイトリンクも載せておくけど、販売者Amazon以外のぼったくりマーケットプレイスにはくれぐれもご注意を。

とても小さいです。SDカードとほぼ同じぐらい
2つのSSDを並べてみたところ

ベンチマーク

  • 換装前:Samsung PM991a(256GB)
  • 換装後:CORSAIR MP600 MINI(1TB)

CrystalDiskMark

測定条件

  • バッテリー駆動
  • Windowsの電源モード:最適なパフォーマンス
  • ベンチマークプリセット:NVMe SSD
CrystalDiskMark 換装前:Samsung PM991a(256GB)
CrystalDiskMark 換装後:CORSAIR MP600 MINI(1TB)

うん、確実に伸びてるね。容量が大きいっていうのもあるだろうね。

アスキーの換装記事で、ベンチマークプリセットがデフォルトで測定されているものがあったので、比較用でデフォルトプリセットでも測ってみた。

CrystalDiskMark 換装後:CORSAIR MP600 MINI(1TB) デフォルトプリセット

読み出しはMicron 2400とそんな変わんないかな。書き込みはMP600 MINIの方がちょっと速いかもしれないけど、この差がゲームで役に立つか?と言うと微妙な気がする。

Rust

自分が最近やってる中のゲームでは、断トツでロード時間が長い。換装でロード時間が短くなるのかをチェック。

測定条件

  • Windows上で実行(SteamOSではEACのエラーで起動しない)
  • バッテリー駆動
  • Windowsの電源設定:最適なパフォーマンス
  • 解像度:1280×800 Full screen
  • Optimized Loading: Partial
  • 他はデフォルト
  • テストに使用したサーバーのマップサイズ:5000
  • 測定は2回目以降の起動/接続で実施し、3回実行した平均値を使用。
    (初回起動/接続時は、DirectX Runtimeのインストールが入ったり、サーバーのマップのダウンロードが入るので、長くなる)

■起動~タイトル画面表示まで

  • 換装前/Samsung PM991a(256GB): 1:03
  • 換装後/CORSAIR MP600 MINI(1TB): 1:01

ほぼ変わらず。

■サーバー接続~ロード完了まで

  • 換装前/Samsung PM991a(256GB): 5:39
  • 換装後/CORSAIR MP600 MINI(1TB): 5:14

20秒以上の短縮を確認!

サイバーパンク2077

Deck Verified(Steam Deck動作確認済み)タイトルから1本。

測定条件

  • Steam OS上で実行(SteamOS 3.4.8)
  • ベンチマークのロード時間で比較。
    「ベンチマークを実行」ボタン押下から、ローディング画面が消えるまでの時間を測定。3回平均値。
  • 画質設定プリセット:Steam Deck
  • 換装前はパッチ1.62、換装後はパッチ1.63

結果

  • 換装前/Samsung PM991a(256GB): 0:18
  • 換装後/CORSAIR MP600 MINI(1TB): 0:11

もともと十数秒ほどで完了するものだけど、これも短縮がみられた。

結論

SteamDeckでSSDを換装するのは効果あり。本体のPCIバスの限界もあって頭打ちにはなるだろうけど、ようやく各メーカーからM.2 2230サイズのSSDが出回り始めたので、選択肢が増えていくことも期待したいな。

あと、過去にGRUBを編集することによるWindowsとのデュアルブート環境の構築方法を書いたけど、今はSteamOS、Windows、Arch Linuxのトリプルブート構成にしてる。Arch Linuxはブート環境構築用。以前と異なり、新しくGRUBをインストールしているので、今後SteamOSのメジャーバージョンアップがあっても、影響を受けにくそう。時間があったら構築方法も書きたいな。

[Steam Deck]Windows環境で、Ext4パーティションを含むSDカードのデータを読み書きする方法

Steam DeckでWindowsとのデュアルブート環境を構築してる方も多いだろうけど、SDカードを挿し替えるのが面倒だし、なによりSDカードを買い足す費用がかかるから、なんとかできないかともがいてみた。

WindowsでExt4パーティションを扱う方法を色々調べたところ、専用のドライバーはありそうだけど、有償だったり、メンテナンスされてなかったり、怪しい所だったり…で使う気がしなかった。そんな中、WSL2を経由すればext4がWindowsでも扱えるという情報を発見。

極力オープンソース技術を使い、かつ比較的安全と思われる方法が見つかったので記録しておく。

先に書いておくと手順が結構くどい。あとLinuxのカーネルモジュールをビルドする関係で時間がかかる。上級者向けかも。オープンソースアプリをソースからビルドした経験があると楽かも。

Steam Deckに搭載されているSDカードリーダーは、SCSI接続の模様。検証始めるまでUSBだと思ってた。

  • 簡単に言うと、WindowsからiSCSIを経由してWSLにマウントして、WSL上に立てたSambaサーバーからまたWindowsへ戻す、というループバックを行う。
  • Windows 11 Home (22H2)で検証。多分Windows 10でもできる。
  • WSL2 / Ubuntu 22.04.1 LTSを利用
  • Windows 11(10) ProだとクライアントHyper-Vが使えるので、うまくデバイスのパススルーができれば、もう少し手順が簡単になる可能性があるかも。
  • Steam Deckの内蔵カードリーダー以外にも応用可能。PCのUSBメモリ等のマスストレージデバイスでも使える。
    • USBだけ使えればいいやという方は、usbipd-winで検索すると幸せになれるかも。
  • 手順はUSB Storage Device Access on WSL2をベースに、パッケージや選択項目の不足をなど細部手順を補完したもの。

前提条件

[WSL側]カーネルモジュールのビルドとインストール

$sudo apt update

ビルドに必要なパッケージをインストール

$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses5-dev git bc dwarves
$ mkdir src
$ cd src

WSL2用のLinuxカーネルソースをダウンロードする

$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel
$ export KCONFIG_CONFIG=Microsoft/config-wsl
$ make menuconfig

コンフィグ画面が出るので、下記の項目にチェックを入れる。

[*] Enable loadable module support

General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Device Drivers --->
    [*] Multiple devices driver support (RAID and LVM) --->
        <*> Device mapper support
    [*] Block Devices ---> 
        <*> Loopback device support 
    SCSI device support  --->
        <*> SCSI disk support
        <*> SCSI generic support
        SCSI Transports --->
            <M> iSCSI Transport Attributes
            [*] SCSI low-level drivers  --->
                <M> iSCSI Initiator over TCP/IP     

File systems ---> 
     <*> FUSE (Filesystem in Userspace) support
     [*] UTF-8 nomalization and casefolding support
      ↑忘れずに!この機能が無いとマウントの所でエラーになる
      
[*] Networking support  --->
   Networking options  --->
      [*] TCP/IP networking 

ビルド開始。Steam Deckで30~40分程度かかる。もしエラーになった場合は、不足しているパッケージが無いか再確認する。

$ sudo make KCONFIG_CONFIG=Microsoft/config-wsl

できたモジュールをインストールする

$ sudo make modules_install

新しく作ったカーネルイメージをWindowsのユーザーディレクトリに配置

$ cp ./arch/x86_64/boot/bzImage /mnt/c/Users/(Windowsのユーザー名)/
nano /mnt/c/Users/(ユーザー名)/.wslconfig

/mnt/c/Users/(ユーザー名)/.wslconfig

[wsl2]
kernel=C:\\Users\\(ユーザー名)\\bzImage
swap=0
localhostForwarding=true

Ctrl+oで書き込みメニューを開き、Alt+dでDos Formatを選択、Enterで保存。Ctrl+xで閉じる。

PowerShellからWSLを再起動

PS > wsl --shutdown

再びWSLのコンソールを開き、モジュールをロード

$ sudo modprobe -v libiscsi
$ sudo modprobe -v scsi_transport_iscsi
$ sudo modprobe -v iscsi_tcp
$ sudo modprobe -v libiscsi_tcp

[WSL側]Systemd有効化

$ sudo nano /etc/wsl.conf

/etc/wsl.conf

[boot]
systemd=true

Ctrl+oで書き込みメニューを開き、Enterで保存。Ctrl+xで閉じる。

PowerShellからWSLを再起動。

PS > wsl --shutdown

再びWSLのコンソールを開いて起動しておく。

[Windows側]iSCSIターゲットのセットアップ

iSCSI Consoleを用いる。

https://github.com/TalAloni/iSCSIConsole

画面右側のReleasesからバイナリーのzipをダウンロードする。

zipを展開すると3つフォルダーがあるが、多分どれを選んでも同じ。(対応している.netのバージョンの違いだと思われる)

管理者権限でiSCSIConsole.exeを起動する。

SmartScreenの警告画面が出た場合は、詳細情報→実行をクリック

起動したらAdd Targetをクリック。

Add Physical Diskをクリック。

一覧にSDXCが表示されるので、それを選択してOKをクリック

ドライブをオフラインにする旨の確認画面が出るのでOKをクリック

Disksの欄にSDカードドライブが追加されるので、OKを押して閉じる

StartをクリックしてiSCSIターゲットを起動する。

ファイアーウォールの確認画面が出た場合は許可する。

[WSL側]iSCSIイニシエーターの設定

open-iscsiのインストール

$ sudo apt install open-iscsi

iSCSIターゲットとの疎通確認をする。

$ export WSLHOSTIP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
$ sudo iscsiadm -m discovery -t st -p $WSLHOSTIP

172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1

$ sudo iscsiadm -m node

172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1

この時点で相手が表示されない場合は、iSCSI ConsoleのStartボタンの押し忘れがないか、ファイアーウォールなどでトラフィックが遮断されていないか確認する。

iSCSIターゲットへ接続。successfulが出ていれば成功

$ sudo iscsiadm -m node --targetname "iqn.1991-05.com.microsoft:target1" --portal "$WSLHOSTIP:3260" --login

Logging in to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] (multiple)
Login to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] successful.

新しくブロックデバイスが出現していることを確認

$ lsblk

SDカードのマウントを行う

$ sudo mkdir -p /mnt/sdcard/SteamLibrary

$ sudo mount /dev/sdc1 /mnt/sdcard/SteamLibrary
(↑/dev/sdc1の部分はlsblkを確認して適宜変更する)

[WSL側]Sambaサーバーのセットアップ

$ sudo apt install samba
$ sudo nano /etc/samba/smb.conf

/etc/samba/smb.confの最下行に下記を追加

[sdcard]
   path = /mnt/sdcard
   read only = no
sudo systemctl restart smbd

Samba用のパスワードを設定。

ここではSambaログイン時に利用するLinuxユーザーアカウント名を指定する。ここではdeckとしている。
必要に応じてsudo smbpasswd -a の部分は変更する

パスワードは空白でも怒られなかった。

sudo smbpasswd -a deck
New SMB Password:(そのままEnter)
Retype new SMB password:(そのままEnter) 

WSLのIPアドレスを確認しておく

$ ip addr

[Windows側]ネットワークドライブとして接続

エクスプローラーを開き、PCの所で「・・・」をクリックし、「ネットワークドライブの割り当て」をクリック

ドライブはお好みで。

フォルダーは、\\(WSLのIPアドレス)\sdcardとする

サインイン時に再接続にチェック、別の資格情報を使用して接続するにチェック。

完了をクリック。

アカウントを尋ねられるので、ユーザー:deck、パスワード:(smbpasswdで設定したパスワード)を入力

SDカードの中身が表示されていれば成功。

Steamライブラリフォルダーに追加

設定→ダウンロード→Steamライブラリフォルダーを開く。

ドライブ一覧の右にある(+)ボタンをクリック

「新しいSTEAMライブラリフォルダーを追加」のダイアログが出るので、先程追加したネットワークドライブを選択

※ネットワークドライブが一覧にない場合は、「別の場所を選択」を選び、「追加」をクリックした後、フォルダ選択画面でネットワークドライブを選択し、その配下にある「SteamLibrary」を選択した状態でOKをクリック。

最後に

これによってSteamOSでインストールしたライブラリーの共有ができると思うけど、心配なのは、Windows/Linuxの両方に対応したゲームで、かつ各プラットフォームによって配信されるファイルの内容が分かれているもの。ファイルが上書きされてうまくゲームが動かなくなったりするかも。

安全にライブラリーを共有したいという方は、フォルダを分ける(といっても歪な構造になりそう)か、事前にSDカードのバックアップをとっておくとよいでしょう。

参考

GRUBを利用したSteam Deckのデュアルブート環境インストール手順

2023/1/4更新:SteamOS 3.4ではこの方法が使えないことを確認しました。
2023/1/22更新
どうやらgrub.cfgの記述ミスが原因だったようで、SteamOS 3.4上でも動作することを確認しました!
セキュリティー上の懸念点があるため、os-proberを使わず、手動でWindowsのメニューエントリーを追加する手順に変更しました。

続きを読む

サーバースペック

備忘録を兼ねて。

パーツメーカー型番備考
CPUAMDEPYC 7443PZen 3 “Milan”、24コア / 48スレッド
メモリMicronMTA18ASF2G72PDZ-3G2R1DDR4-3200 16GB
ECC Registered ×8
(合計128GB)
マザーボードSupermicroH12SSL-NT
SSDSilicon PowerP34A801TB ×2 [RAID1] M.2 NVMe
HDDWestern DigitalWD RED WD80EFBX8TB ×2 [RAID1]
HDDケースDiracDIR-SG3403.5インチHDD4台搭載可能 ×2台
電源ThermaltakeToughpower GF1 850W
ケース汐見板金AX2 Ver1.2

YouTubeのメインのアカウントを、ブランドアカウントから本来のアカウントに移行した話

※2022年11月現在の挙動です。サービスなので、今後仕様が変わる可能性があることに注意。

メンバーシップギフトの機能が追加されてしばらく経過するが、今まで一度もギフトに当たったことがない。

調べてみると、ギフトを受け取る設定がチャンネルごとに必要なんだとか。でも自分のアカウントにはそんな設定がない。

更に調べると、「ブランドアカウントでは、メンバーシップギフトを受け取ることができない」ことが判明!自分はそれだった。過去に本名バレを防ぐために、そういう運用にしてたんだっけな。

そういうわけで、本来のアカウントでYouTubeを使う運用にすることにした。

本名バレしないのかという疑問については、YouTubeのコメントの書き込み時の名前は「アカウントに紐づいているチャンネル名」であって、そのチャンネル名は変更可能なため、問題なかった。以前の仕様だとGoogleアカウントの名前がそのまま表示されていたはずだけどね。

アカウントの移行はそんなに簡単にできるものではなかった。

ブランドアカウントでは、いくつかのチャンネルメンバーシップに入っていた。支払いは大元のGoogleアカウントに紐づいている。だから本来のアカウントでも使えるんでしょ?と思っていたが、本来のアカウントに切り替えると、「メンバーシップに入っているのにメンバー特典が使えない。でもなぜかメンバー限定動画は見られる」という中途半端な状態になってしまった。

このことについてサポートに問い合わせたところ、「チャンネルメンバーシップについては、ブランドアカウントで登録した場合は、そのブランドアカウントでのみ特典が使え、本来のアカウントからは特典が使えないとのこと。その逆も同じで、本来のアカウントで登録している場合は、ブランドアカウントでは特典が使えない」とのこと。

なので仕方なく、ブランドアカウントでメンバーシップを解約し、本来のアカウントで登録し直すことにした。すぐ移行できるんでしょ?と思っていたが、これもそんなことはなかった。解約しても期限が切れるまでは効力があるらしく、本来のアカウントから登録しようとすると、エラーになったり、空白の画面が表示されるだけだった。

期限切れを待って、ようやく本来のアカウントで登録できるようになった。なお、メンバーの期間についてはアカウント間で共通らしく、引き継がれる模様。これはありがたいけど、なんか複雑な仕様…