見出し画像

ミニPCを24H Linuxサーバー化する2 ~EVO-X2 AI PC編 Linux初期設定メモ~

こんにちは。Rcatです。
2年ほど前にこちらの記事で省電力のミニPCをLinuxサーバー化して今日まで運用してきました。

しかし、AIの登場ある程度ならローカルで動かせるようになってきた今、AIをホストしたいんです。となるとさすがにN100+16GBでは厳しい
というわけで↓思い切って買っちゃいました。というわけでこちらをLinux AIサーバー化していきます。

ちなみにセールだったので295408円で買えました。ほぼ10万引きじゃんw

※この製品には冷却の闇が明らかになりました。多分デザインに冷却性能が負けたのだと思われますがこれはひどいw

次回:Ubuntu 26.04に入れ替え


なにやるの?

この記事では次の事をやります
何を買ったのかの詳細もですが、Linuxを入れて運用するまでの手順のメモとしても活用いただけるようにします。というか自分用メモ。

何かやるたび追記予定なので、よろしければスキしてみてください


買ったもの

Amazonで"EVO-X2"というミニPCを買いました。
セールで25%オフ29.5万でゲットです。まさかミニPCごときに30万掛ける日が来るとは思いませんでした。

商品紹介の動画にちゃんとUbuntu対応って書いてあります。安心ですね!

引用元:https://www.amazon.co.jp/dp/B0FRMDHSD6

スペック

  • CPU Ryzen AI Max+ 395
    16コア32スレッドの驚異的なCPUです。TDPは55WでN100の10倍。スコアも10倍。同時に組み立てている自作PCは9700Xなんですが、これよりスコア高い…。
    ちなみにNPUもあるが、Linuxは遅れそうなので多分しばらくは使えない。

  • メモリ LPDDR5X 8000MHz 128GB
    頭おかしいですね。巨大なLLMを試すのにぴったり。

  • グラフィック
    CPU内蔵 Radeon 8060S。商品説明だと4070より高性能らしい。こっちのサイトだと3060より高性能と出てくる。
    最大の特徴はシステムとVRAMを共有すること。つまり128Gのメモリをわけて使える(上限96G)。なのでVRAM96G欲しければ90万はらって5090x3を買うか…とはなりません。
    CPU内蔵グラフィックが、数世代前とはいえデスクトップGPUに匹敵してるというのがまず意味わからんw

  • 映像出力
    DP + HDMP + TypeCx2の4画面。Linuxでは1画面もいらないです。はい。
    正面のUSB4がTypeCのDPなので、Linuxで急遽ほしい時にすぐさせるのはいいと思う。

  • ストレージ
    M.2 2TB。そんなに要らないけど、このモデルだと2Tだった。
    M.2スロットは後1スロット空きがあるらしい。手元に余ってるのは普通の2.5インチなのでUSB接続で使おうと思います。主にバックアップ用に。

  • LAN
    2.5Gbps対応。でも無線LANやL2スイッチが1Gまでしか対応してないんですが。というか家の配線2.5とか10Gにしてる人いるの?
    同じ理由でWi-Fi 7 46Gbpsとか言われても結局1Gbpsしか出ません。仮に10Gにしてもネットがそれだけ出るとは限らないので、ローカルで巨大なデータをNASとやり取りくらいしか使い道ないのでは?
    まぁ何も知らないとこういうので高いWi-Fi買わされちゃうんだろうなw

Rcatのレビュー

Ubuntu + llama-cpp-pythonの組み合わせでCPU内蔵のRadeon 8060Sを使った推論が可能だが、現状そこに至るには少々ハードルが高い(この辺は別途記事にしてます。)

このCPUやGPUはまだ情報が少なく、上手く行くかは正直賭けだったのですが使えてよかったです。
巨大な共有メモリを生かし、llamaの70BモデルやGPT-OSS 20Bなど、普通では試せない巨大モデルを推論することができて満足。
しかし、30Bを超えるモデルは応答速度に難が出てくるので実用的とは言えないが、そもそもホストできる時点ですごいことなんだよなぁ・・・。

・UbuntuでのLLM推論の為のドライバとROCmのインストールについて
Ryzen AI MAX+ 395の公式ページだとLinux向けが出てきませんが、色々調べて何とか導入できました。
商品説明に載ってる動画のサムネイルだとUbuntu対応と書いてあるので簡単に行くかなぁと思っていましたがそうでもありませんでした(この辺は本記事)。
Linuxはそういうところがあるので仕方ないですが、情報不足は否めないですね。公式から発信してほしい。

・VRAM96GBの必要性について
大きなモデルでもホストできますが、それを喰らいつくすレベルのモデルは処理能力が足りません。
性能を考えれば32G程度で十分。あるいは複数のモデルをホストするために使うというのはあり。
コンテキスト長を数万単位にしてもまだ余裕がある。そういうののためにVRAMを使うのはありだろう。
システムのほうにメモリを振って、そっちにKVキャッシュを持たせる使い方をすれば、LLMだけで32G - 64G近くは使うことになるので無駄ではない。

さらにここでStable Diffusion XLも立ち上げてOK。LLMにGPU画像生成にCPU。完璧な采配。GPUでも動きますが、世界が変わるほどでもなかったのでLLMに譲りました。

・総評
これからLLMをたしなむにあたりいいものが買えたと思っています。
デスクトップではないので、この30万がどの部品に割り当てられているのか不明で価格の妥当性はよくわかりませんが、LLMを動かすだけだと、「で、30万だした結果は?」という感じ。うまくいかせなければ意味はないだろう。

着弾

さて、届きました!

ロゴのシールの輝きがまぶしい!!

背面のヒートシンクは想像以上にごついですね。

前回買ったものはこちら

適当に配線して電源投入!

すごくどうでもいいんですが、電源を入れると光ります。ゲーミングです。
で、覗くと何とメーカー名がずらっと並んでます。なんだこれは。そのコストはカットしなさい

Windowsのうちにやること

まずはWindowsの初期セットアップをします。
せっかくあるのだから有効活用します。

スペック確認

まずはタスクマネージャーを覗きます!

CPU
プロセッサ表示にするとえぐい…w

GPU
128Gのうち半分が専用に割り当てられているっぽい。
更に共有で32Gがあるので96GのVRAMがある。普通にえぐい。

メモリ
仕様通り8スロットで8000MT。やべぇよ。

NPU
表示は出るけどこれを使うには対応ソフトがいるんですよね。さて生かせるときは来るのか。

リモートデスクトップの設定

せっかくWindowsも入っているので、必要とあらば使えるようにします。
いちいち画面繋ぐのも面倒なので、こちらもリモートデスクトップです。
Pro版なのでリモートデスクトップが使えます。

BitLockerの無効化

最初から無効でした。なんかあったとき面倒なので基本無効ですね。持ち歩くわけでもないし。

Windows Update

もし使うとなったときに少し手も安全かつアプデ時間が短くなるようにやっておきます。
まぁ初期設定中にもやったんですがなんか残ってるんですよね。

あくしろー

MACアドレスの確認

Linuxのデスクトップでもいいですが、確認できるので先に見ておきます。これはDHPCサーバーの方でIPアドレスを固定する場合に使います。
そうでない場合は無視でOK。

VRAMの調整について

インストール済みのソフトの中に"AMD Software"というのがあったので、開いたところ変更画面がありました。
最大で96GBを割り当てられるみたいです。

BIOSとVRAMの調整

終わった後にBIOSを見てきました。ここにもVRAMのような設定がありました。
これを見る限りMAXで96G割り当てが限界のよう。システムにこれでも32G残ってるんだから後もう16くらい行っちゃおうよ!


Linux(Ubuntu)のインストール

さて、いよいよメインコンテンツです。ここまで長かったですね。
早速作業していきましょう。

起動ドライブの作成

前回の記事を参考にインストールしていきます。
まずは最新のUbuntuを用意します。

今回は24.04.3 LTSにします。
インストールドライブの作成には"
rufus"を使用します。
Ubuntuをダウンロード後、USBドライブを挿してから起動し、デバイスとファイルを選択してスタートを押すだけ。

USBメモリはないので古のClass4 SDカードをUbuntuインストールメディアにしました。
2年前と同じ手口ですね。前のUbuntuを上書きして作成っと!

左Windows11 右Ubuntu

インストール

ではUSBを接続して待望のBIOSに入りましょう!

と思ったら、Windowsを再起動するときになぜかUSBから起動になってUbuntuがライブ起動しちゃいました!BIOSはまた後で見ましょう。

というわけで、インストーラーが開きますので進めていきます。
いつも通りとりあえず拡張で色々入れてもらいます。

ドライバの話が出てきました。Radeon 8060Sってこれで入るのか?
公式サイトでも出てこないからなんか面倒なことになりそうな予感。

ここは共存を選びます。

Winは500GB残してやればいいかな。どうせほぼ使わないだろうし。

後は手順通り進めて終わるまで待ちましょう!
ちなみに終わった後、もう一回USBで起動しないように、USBを取ってからEnterを押してくださいという画面になるので注意。知らないと永遠に待ち続ける羽目になります。

Ubuntuでブートさせる

前回もそうでしたが、同居してるのでこのままだとWindowsが起動してきます。

BootのオプションからUbuntuの優先順位を上げておきましょう。

立ち上がりました!

初期設定(デスクトップ上でやること)

さて、サーバーにするからにはSSHが基本になるんですが、その前にデスクトップが繋がっているうちにやっておいた方が楽なことをやってしまいましょう。

アップデート

これは最優先で行うべきでしょう。

sudo apt -y update
sudo apt -y upgrade

あるいは通知が来るのでそこでポチってもいいかも

リモートデスクトップ

Windowsのリモートデスクトップが使えるらしい。
Linuxでも、ものによってはGUIで操作も最近見かけるので今回から設定することにした。

色々調べたが、24から設定が変わっているのでここが一番参考になる。
簡単に言うと、システムからリモートデスクトップの設定に入り、デスクトップシェアリングとリモートログインを有効化する。

この時、リモートログインのユーザーは別名にすること。でないとうまくつながらない。

準備が出来たらWindowsからPC名で接続します

ユーザー名を入力しないといけないので、その他から別のアカウントを選択してユーザー名とパスワードを入れてログインします。

デスクトップにログインできました。

MACアドレスの確認とIP固定

この辺は人によりやり方が変わると思いますが、私の場合はルーターがMACアドレスによる固定IP払い出しに対応しているのでルーターで設定します。
なのでMACアドレスを確認します。
ちなみに、IPを固定しないとSSHでリモートアクセスできないので注意してください。

SSHの有効化

SSHとは、外部からシェルにログインできる機能です。
Linuxはもともとコマンドが基本なので、画面には繋がずにこのSSHを使ってメインのWindowsPCから操作するものとします。
なお、気にする人はSSHのポート番号は変えておきましょう。さすがにここを開けることはしないので私は変えないです。
更に気にする人は公開鍵認証にアップグレードもしておきます。
上記はミスるとリモートアクセス不可になるので…。

 sudo apt install openssh-server

ファイアウォール設定

Ubuntuには標準でufwが入っているのでこれを使います。
ただしデフォルトでは無効なので手動でオンにする必要があります。
ミスるとSSHが切断されるので、デスクトップにいる今やっておいた方がいいです。

#状態を確認
sudo ufw status
状態: 非アクティブ

#先にsshを開けておく
sudo ufw allow ssh

#リモートデスクトップも開ける
sudo ufw allow 3389
sudo ufw allow 3390

#有効化する
sudo ufw enable
#SSHから接続していると切れるかもよ?って警告が出るのでy
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。

#ポートを開放の例(httpサーバー)
sudo ufw allow 80

初期設定(ここからはリモート)

さて、sshが出来たらもうデスクトップにようはないので、いつもの環境からリモートで作業です。
リモートにはTera Term / Win SCPを使います

TeraTerm

オープンソースのターミナルエミュレーター。SSH経由でLinuxのシェルにログインします。
OSをインストールする時にユーザーの作成をしていると思うので、それでログインしてみます。
IPアドレスはさっき確認Or固定したのでそれを使います。
ログインできない場合、先程のファイアウォールでSSHをブロックしていないか確認しましょう。

ログインできればこんな感じになります。

WinSCP

さて、コマンドだけで操作は大変なので、データの転送にはWinSCPを使います。
SFTPはSSHを活用したセキュアなFTPのようなもので、先程SSHを有効にしたならもう使えます。ログイン情報は先程と同じ。

こんな感じで左側ローカル右がリモートといった感じでデータの転送が行えます。普通にエクスプローラーからドラッック&ドロップでも大丈夫です。便利ですね。
唯一の難点といえば、権限がない場合は書き換えられないので、事前にシェルの方で権限を設定し直してからじゃないと一部のテキストは操作できない場合があるというところでしょうか?fstab等←それくらいvimでやれw。

ROCmとGPUドライバのインストール

こちらの記事で画像生成をしている方がいましたので、参考にドライバを入れてしまいます。
上記参考でも参照していましたが公式を見ておいた方がいいですね。

まずROCmを入れます。
※↓公式サイトのコピペなのでここではなく公式のをコピペ推奨

wget https://repo.radeon.com/amdgpu-install/7.0.2/ubuntu/noble/amdgpu-install_7.0.2.70002-1_all.deb
sudo apt install ./amdgpu-install_7.0.2.70002-1_all.deb
sudo apt update
sudo apt install python3-setuptools python3-wheel
sudo usermod -a -G render,video $LOGNAME # Add the current user to the render and video groups
sudo apt install rocm

ちなみに最終段でこれ22.2G使うぞと出てくる。さすがにでかいですね。

次にGPUドライバです。
エラーにはならないのでこれで入ったのかな?

wget https://repo.radeon.com/amdgpu-install/7.0.2/ubuntu/noble/amdgpu-install_7.0.2.70002-1_all.deb
sudo apt install ./amdgpu-install_7.0.2.70002-1_all.deb
sudo apt update
sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)"
sudo apt install amdgpu-dkms

終わったら一旦再起動します。

参考記事によると、"amd-smi"と"rocminfo"のふたつのコマンドが実行出来れば入っているみたいなので実行します。
メモリの所を見るとちゃんと96GBがGPUに割り当てられているみたいです。

rcat@rcat-EVO-X2:~$ amd-smi
+------------------------------------------------------------------------------+
| AMD-SMI 26.0.2+39589fda      amdgpu version: 6.14.14  ROCm version: 7.0.2    |
| Platform: Linux Baremetal                                                    |
|-------------------------------------+----------------------------------------|
| BDF                        GPU-Name | Mem-Uti   Temp   UEC       Power-Usage |
| GPU  HIP-ID  OAM-ID  Partition-Mode | GFX-Uti    Fan               Mem-Usage |
|=====================================+========================================|
| 0000:c5:00.0    AMD Radeon Graphics | N/A        N/A   0             N/A/0 W |
|   0       0     N/A             N/A | N/A        N/A            256/98304 MB |
+-------------------------------------+----------------------------------------+
+------------------------------------------------------------------------------+
| Processes:                                                                   |
|  GPU        PID  Process Name          GTT_MEM  VRAM_MEM  MEM_USAGE     CU % |
|==============================================================================|
|  No running processes found                                                  |
+------------------------------------------------------------------------------+
rcat@rcat-EVO-X2:~$ rocminfo
ROCk module version 6.14.14 is loaded
=====================
HSA System Attributes
=====================
Runtime Version:         1.18
Runtime Ext Version:     1.11
System Timestamp Freq.:  1000.000000MHz
Sig. Max Wait Duration:  18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model:           LARGE
System Endianness:       LITTLE
Mwaitx:                  DISABLED
XNACK enabled:           NO
DMAbuf Support:          YES
VMM Support:             YES
以下略

やることやっとく

前回の記事に従いとりあえず色々実行する
リモートデスクトップを設定したので、ランレベルは下ません。

$スワップの確認と削除(128Gメモリにスワップなんていらん)
sudo swapon --show
sudo swapoff -a
sudo rm /swap.img

$デフォルトのランレベルの変更(グラフィック無効化 メモは残すが今回はやらない)
sudo systemctl set-default multi-user.target

$OpenCV用(どうせすぐ使うので入れる)
sudo apt -y install libatlas-base-dev

$CPU使用率制限コマンド(私のツールで偶に使う)
cpulimit

$GITコマンド(Pythonライブラリのインストールで裏で使われることがある)
sudo apt install git
sudo apt install git-lfs

$cmakeやcurl
sudo apt install cmake
sudo apt install libcurl4-openssl-dev

$ifconfigなど
sudo apt install net-tools

aliasesを作る

いわゆるコマンドのショートカットですね。
最初に自分のホームに".bash_aliases"というファイルを作ります。
この中に任意のaliasesを書き込んでいくと、コマンドショートカットが出来上がるわけですね。

改行コードに注意。"LF"にします。Windowsの"CRLF"だと正しく読み込まれません。
今回はオリジナルのサービス作成(この後使う)コマンドをショートカット化します。

登録するコマンドはもちろん格納しておく必要があります。以下の記事の内容を格納します。

Pythonの準備

今回は3.12が入っていました。基本的には問題ないはずなのでこのままでいきます。
なお、pipとvenvが入っていないので、これらは入れる必要があります。

rcat@rcat-EVO-X2:/Data/tmp$ python3
Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

#pipが無かったので入れる
rcat@rcat-EVO-X2:/Data/tmp$ sudo apt install python3-pip

#venvもないので入れる(先にpython3 -m venv venvを実行すると、下記コマンドが出てくる)
rcat@rcat-EVO-X2:/Data/tmp$ python3 -m venv venv
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
    apt install python3.12-venv
You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

rcat@rcat-EVO-X2:/Data/tmp$ sudo apt install python3.12-venv

FFMPEGを入れる

何かと使われているFFMPEG。私は音楽プレイヤーサーバーで使っていますが、例えば音声認識ライブラリのWisperでも裏で使われていたはずです。
なので入っていないとどこかでつまずくので入れておきます。

$ ffmpeg
コマンド 'ffmpeg' が見つかりません。次の方法でインストールできます:
sudo snap install ffmpeg  # version 4.3.1, or
sudo apt  install ffmpeg  # version 7:6.1.1-1ubuntu1
他のバージョンについては 'snap info ffmpeg' を確認してください。

rcat@rcat-EVO-X2:/Rcat_Service/Script/MusicServer$ sudo apt  install ffmpeg

screenを入れる

screenはシェルの中で新たなシェル(スクリーン)を作成して自在にアタッチ/でタッチできるもので、Windowsでいうコマンドプロンプトをたくさん立ち上げる的な感じです。

一番の特徴が、デタッチすればSSHからログアウトしても処理は継続し、かつ再アタッチすることで、後日何事もなかったかのように戻ってくること。
それこそ、何日もかかる処理(のくせに最後は対話を要求)するコマンド(heretic)なんかで真価を発揮します。

#インストール
$ sudo apt install screen
#設定 (やらなくてもいいけどたぶん使いづらい思いをする)
$ sudo vi ~/.screenrc
termcapinfo xterm* ti@:te@
defscrollback 100000
defutf8 on
defencoding utf8
encoding utf8 utf8
startup_message off
vbell off
altscreen on
shell $SHELL
#スクリーンを起動
$ screen
#この状態で以下の操作ができる
デタッチ: Ctrl+A -> d
終了: Ctrl+D
#デタッチ後は、screen -rで戻ってこれる
$ screen -r
#一覧
$ screen -ls

オリジナルサービスの登録

次にsystemd(Windowsで言うタスクスケジューラ)を使い自作サービスを登録して、電源投入時に自動実行するサービスを作ります。
具体的にはアップデートの自動化DiscordのBOTやWEBサーバーなんかを実行します。

まず最初に、今回はオリジナルサービス専用フォルダをルート直下に作ります。
私は以下の名前で固定ですね。分かりやすいし。直下なのでルートがいりますがw。

rcat@rcat-EVO-X2:~$ sudo mkdir /Rcat_Service
rcat@rcat-EVO-X2:~$ sudo chmod -R 777 /Rcat_Service

アップデート自動化

アップデートをいちいちログインでやるのは面倒なので、毎日自動でコマンドを打ってもらいます。
前回は調べて出てきたcrontabを使いましたが、今日までにsystemdとタイマーという要素を知ったのでそっちに移行します。

やることは簡単です。いつもの2コマンドをタイマーでやるだけ。
まず以下を用意します

任意の所に格納したら、さっき追加したオリジナルコマンドを起動する。

画面に表示される説明に従い操作すると、サービスファイルとタイマーファイルができる。

開くとこんな感じ。ただしこれはユーザー権限になっているので少し変える。
具体的にはUser=ユーザー名の行を消す。これでrootで実行されるため、きちんとsudo付のアップデートコマンドが走る。

ちなみにタイマーファイルはこんな感じ。毎日午前4時にアップデートを確認する。ただそれだけ。

出来上がったら、オリジナルコマンドのServiceAddを使い、タイマーとサービスファイルを登録します。
登録したら、タイマーの方だけをsystemctlコマンドで有効にします。

rcat@rcat-EVO-X2:/Rcat_Service/update$ ls
R_system_update.service  R_system_update.timer  update.sh
rcat@rcat-EVO-X2:/Rcat_Service/update$ ServiceAdd R_system_update.service

File OK
Created symlink /etc/systemd/system/multi-user.target.wants/R_system_update.service → /etc/systemd/system/R_system_update.service.
rcat@rcat-EVO-X2:/Rcat_Service/update$ ServiceAdd R_system_update.timer

File OK
rcat@rcat-EVO-X2:/Rcat_Service/update$ sudo systemctl enable R_system_update.timer
Created symlink /etc/systemd/system/timers.target.wants/R_system_update.timer → /etc/systemd/system/R_system_update.timer.
rcat@rcat-EVO-X2:/Rcat_Service/update$

statusを使うことで、本当に登録できたのか確認することができます。
以下を見ると、タイマーにはサービスが紐づいていて、サービスにはタイマーが紐づいているのが分かります。

rcat@rcat-EVO-X2:/Rcat_Service/update$ systemctl status  R_system_update.timer
○ R_system_update.timer - R_system_update
     Loaded: loaded (/etc/systemd/system/R_system_update.timer; enabled; preset: enabled)
     Active: inactive (dead)
    Trigger: n/a
   Triggers: ● R_system_update.service

10月 11 16:13:16 rcat-EVO-X2 systemd[1]: /etc/systemd/system/R_system_update.timer:3: Failed to add dependency on /Rcat_Servic>
10月 11 16:13:16 rcat-EVO-X2 systemd[1]: /etc/systemd/system/R_system_update.timer:7: Unit type not valid, ignoring: /Rcat_Ser>
rcat@rcat-EVO-X2:/Rcat_Service/update$ systemctl status  R_system_update.service
○ R_system_update.service - R_system_update
     Loaded: loaded (/etc/systemd/system/R_system_update.service; enabled; preset: enabled)
     Active: inactive (dead)
TriggeredBy: ○ R_system_update.timer
rcat@rcat-EVO-X2:/Rcat_Service/update$

サービス作成スクリプトを使って登録する

その他の自作サービスと片っ端から再登録していきます。
数が多いですが、前使ってたファイルがそのままあるので楽ですw。
サービスファイルの作り方は上記アップデート自動化と同じです。起点はshのシェルにしておくのが簡単になるポイント。

消費電力

数値は画像で確認願います。

  • 無負荷
    さすがGPUは統合されているだけあってアイドル時に無駄が無い。これがアイドルマスターってやつなのか?
    普通のPCをサーバーにしたら、無負荷だったとしてもこんなんでは済まないのでやっぱりミニPCってすごい。

  • LLM推論中
    GPU100% / CPU5%でこのくらい。一気に上がりましたね。

  • LLM推論 / パフォーマンスモード
    +50Wです。さらに跳ね上がりました。

  • LLM推論 / 省エネモード
    -50Wです。つまりモードで±100Wの差があると

パフォーマンスモードへ切り替え

LLMを動かす

さて、このPCに手を出したメインです。これが出来なければ買った意味がほぼない。
多分NPUはまだ未対応なので、内蔵のRadeonを使って推論するのを目標とします。いつかNPUも使いたいけど、Linux先にWindowsMLが対応しそう。
まぁそういうのを試せるためにWindowsも残してあるんですが。

長くなるのでこのセクションは分けました
下記では15種類のLLMを内蔵Radeon 8060Sを使って推論しています。
今までは絶対に手が出ななかった70Bモデルや、GPT-OSS 120Bなども動かしています。

LLMをホストする方法はこちら。
このツールを導入することでホストします。

ちなみに、GPUを使ってFANがうるさくなると、負荷が下がってもうるさいままです。
十分に冷えてから5秒くらいGPUを使うと再度FANの速度が設定されるのか静かになる。これは直すべきでは?

追加SSDをマウント

パーティションの作成

まずはディスクが認識されているか確認します。

rcat@rcat-EVO-X2:~$ sudo lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0     4K  1 loop /snap/bare/5
loop1         7:1    0  73.9M  1 loop /snap/core22/2133
loop2         7:2    0  73.9M  1 loop /snap/core22/2139
loop3         7:3    0 140.6M  1 loop /snap/docker/3265
loop4         7:4    0 249.2M  1 loop /snap/firefox/7084
loop5         7:5    0 249.1M  1 loop /snap/firefox/7177
loop6         7:6    0  18.5M  1 loop /snap/firmware-updater/210
loop7         7:7    0   516M  1 loop /snap/gnome-42-2204/202
loop8         7:8    0  11.1M  1 loop /snap/firmware-updater/167
loop9         7:9    0 516.2M  1 loop /snap/gnome-42-2204/226
loop10        7:10   0  91.7M  1 loop /snap/gtk-common-themes/1535
loop11        7:11   0  10.8M  1 loop /snap/snap-store/1270
loop12        7:12   0  50.8M  1 loop /snap/snapd/25202
loop13        7:13   0  50.9M  1 loop /snap/snapd/25577
loop14        7:14   0   576K  1 loop /snap/snapd-desktop-integration/315
loop15        7:15   0   210M  1 loop /snap/thunderbird/769
loop16        7:16   0 226.2M  1 loop /snap/thunderbird/825
sda           8:0    0 953.9G  0 disk
mqsda1        8:1    0 953.9G  0 part /SSD
sdb           8:16   0   1.8T  0 disk
mqsdb1        8:17   0   1.8T  0 part
sdc           8:32   0   1.8T  0 disk
tqsdc1        8:33   0     1M  0 part
tqsdc2        8:34   0    15M  0 part
mqsdc3        8:35   0   1.8T  0 part
sdd           8:48   0   1.8T  0 disk
tqsdd1        8:49   0     1M  0 part
tqsdd2        8:50   0    15M  0 part
mqsdd3        8:51   0   1.8T  0 part
sde           8:64   0   1.8T  0 disk
tqsde1        8:65   0     1M  0 part
tqsde2        8:66   0    15M  0 part
mqsde3        8:67   0   1.8T  0 part
nvme0n1     259:0    0   1.8T  0 disk
tqnvme0n1p1 259:1    0   100M  0 part /boot/efi
tqnvme0n1p2 259:2    0    16M  0 part
tqnvme0n1p3 259:3    0 464.7G  0 part
tqnvme0n1p4 259:4    0   1.2G  0 part
mqnvme0n1p5 259:5    0   1.4T  0 part /

今回は4本あり、以下が初期化対象です。

  • /dev/sdb

  • /dev/sdc

  • /dev/sdd

  • /dev/sde

fdiskコマンドを使ってパーティションを作成します
今回はすでに使っているものを流用するので、まずは"d"で削除
次に"n"で新規作成。ここは規定値を受け入れればいいので何も入れずにEnter。
"p"で確認して問題なければ"w"で書き込んで終了。

rcat@rcat-EVO-X2:~$ sudo fdisk /dev/sdb

fdisk (util-linux 2.39.3) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): d
パーティション 1 を選択
パーティション 1 を削除しました。

コマンド (m でヘルプ): n
パーティション番号 (1-128, 既定値 1):
最初のセクタ (34-3907029134, 既定値 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3907029134, 既定値 3907028991):

新しいパーティション 1 をタイプ Linux filesystem、サイズ 1.8 TiB で作成しました。

コマンド (m でヘルプ): p
ディスク /dev/sdb: 1.82 TiB, 2000398934016 バイト, 3907029168 セクタ
Disk model: USB3.0 DISK00
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 2DBF87E4-CB08-4F41-AA33-3A74D6DBF034

デバイス   開始位置   最後から     セクタ サイズ タイプ
/dev/sdb1      2048 3907028991 3907026944   1.8T Linux ファイルシステム

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

複数あるディスクはこうなります

コマンド (m でヘルプ): d
パーティション番号 (1-3, 既定値 3):

パーティション 3 を削除しました。

コマンド (m でヘルプ): d
パーティション番号 (1,2, 既定値 2):

パーティション 2 を削除しました。

コマンド (m でヘルプ): d
パーティション 1 を選択
パーティション 1 を削除しました。

コマンド (m でヘルプ): d
パーティションは何も設定されていません!

終わったらこんな感じ

rcat@rcat-EVO-X2:~$ sudo lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0     4K  1 loop /snap/bare/5
loop1         7:1    0  73.9M  1 loop /snap/core22/2133
loop2         7:2    0  73.9M  1 loop /snap/core22/2139
loop3         7:3    0 140.6M  1 loop /snap/docker/3265
loop4         7:4    0 249.2M  1 loop /snap/firefox/7084
loop5         7:5    0 249.1M  1 loop /snap/firefox/7177
loop6         7:6    0  18.5M  1 loop /snap/firmware-updater/210
loop7         7:7    0   516M  1 loop /snap/gnome-42-2204/202
loop8         7:8    0  11.1M  1 loop /snap/firmware-updater/167
loop9         7:9    0 516.2M  1 loop /snap/gnome-42-2204/226
loop10        7:10   0  91.7M  1 loop /snap/gtk-common-themes/1535
loop11        7:11   0  10.8M  1 loop /snap/snap-store/1270
loop12        7:12   0  50.8M  1 loop /snap/snapd/25202
loop13        7:13   0  50.9M  1 loop /snap/snapd/25577
loop14        7:14   0   576K  1 loop /snap/snapd-desktop-integration/315
loop15        7:15   0   210M  1 loop /snap/thunderbird/769
loop16        7:16   0 226.2M  1 loop /snap/thunderbird/825
sda           8:0    0 953.9G  0 disk
 sda1        8:1    0 953.9G  0 part /SSD
sdb           8:16   0   1.8T  0 disk
 sdb1        8:17   0   1.8T  0 part
sdc           8:32   0   1.8T  0 disk
 sdc1        8:33   0   1.8T  0 part
sdd           8:48   0   1.8T  0 disk
 sdd1        8:49   0   1.8T  0 part
sde           8:64   0   1.8T  0 disk
 sde1        8:65   0   1.8T  0 part
nvme0n1     259:0    0   1.8T  0 disk
tqnvme0n1p1 259:1    0   100M  0 part /boot/efi
tqnvme0n1p2 259:2    0    16M  0 part
tqnvme0n1p3 259:3    0 464.7G  0 part
tqnvme0n1p4 259:4    0   1.2G  0 part
mqnvme0n1p5 259:5    0   1.4T  0 part /

フォーマット

次にフォーマットを行います。Linuxではext4が一般的なのでこれにします。
mkfs.ext4コマンドに /dev/sdb1のようにパーティションを選択して実行します

rcat@rcat-EVO-X2:~$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 488378368 4k blocks and 122101760 inodes
Filesystem UUID: fa484399-3a6a-44a0-bd5a-c22beae0cbad
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

rcat@rcat-EVO-X2:~$ sudo mkfs.ext4 /dev/sdc1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 488378368 4k blocks and 122101760 inodes
Filesystem UUID: a15fc491-ce6e-4cb7-9857-dc61e75235bf
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

rcat@rcat-EVO-X2:~$ sudo mkfs.ext4 /dev/sdd1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 488378368 4k blocks and 122101760 inodes
Filesystem UUID: a41a80cf-7421-4876-a983-6fa63f2e9366
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

rcat@rcat-EVO-X2:~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 488378368 4k blocks and 122101760 inodes
Filesystem UUID: 76cc3633-fdc3-4bec-9170-1d7d9e86603d
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

フォーマットが終わったらblkidコマンドを使うことで確認できます
一番下の4個が今回フォーマットしたもので、きちんとext4かつnot mountedになっているのでまだマウントできていないことがわかります。

rcat@rcat-EVO-X2:~$ sudo blkid -o list
device                                fs_type       label          mount point
--------------------------------------------------------------------------------------------------------
/dev/nvme0n1p5                        ext4                         /
/dev/loop1                            squashfs                     /snap/core22/2133
/dev/nvme0n1p3                        ntfs          Windows        (not mounted)
/dev/nvme0n1p1                        vfat          SYSTEM         /boot/efi
/dev/nvme0n1p4                        ntfs          Recovery       (not mounted)
/dev/loop8                            squashfs                     /snap/firmware-updater/167
/dev/loop15                           squashfs                     /snap/thunderbird/769
/dev/loop6                            squashfs                     /snap/firmware-updater/210
/dev/loop13                           squashfs                     /snap/snapd/25577
/dev/loop4                            squashfs                     /snap/firefox/7084
/dev/loop11                           squashfs                     /snap/snap-store/1270
/dev/loop2                            squashfs                     /snap/core22/2139
/dev/loop0                            squashfs                     /snap/bare/5
/dev/loop9                            squashfs                     /snap/gnome-42-2204/226
/dev/loop16                           squashfs                     /snap/thunderbird/825
/dev/loop7                            squashfs                     /snap/gnome-42-2204/202
/dev/sda1                             ext4                         /SSD
/dev/loop14                           squashfs                     /snap/snapd-desktop-integration/315
/dev/loop5                            squashfs                     /snap/firefox/7177
/dev/loop12                           squashfs                     /snap/snapd/25202
/dev/loop3                            squashfs                     /snap/docker/3265
/dev/loop10                           squashfs                     /snap/gtk-common-themes/1535
/dev/nvme0n1p2                                                     (not mounted)
/dev/sdd1                             ext4                         (not mounted)
/dev/sdb1                             ext4                         (not mounted)
/dev/sde1                             ext4                         (not mounted)
/dev/sdc1                             ext4                         (not mounted)

自動マウント

Linuxは挿したら認識はするが読み書きできないので、マウントする必要があります。起動時に自動マウントするには"fstab"を書き換える必要がりますのでそれをやります。

デバイスの指定方法はいくつかありますが、確実性の高い"UUID"で行います。
なお、rootでないと書き換えできないので、WinSCPではなくviコマンドで書き換えます

#まず最初に接続されているデバイス一覧を表示
#手動でマウントしていなければ(not mounted)になる。
#
rcat@rcat-Green-G5:~$ sudo blkid -o list
device                                                fs_type         label            mount point                                               UUID
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/dev/nvme0n1p5                                           ext4                             /                                                            4344a6a1-ca75-4b5a-8a53-fb0962fae053
/dev/loop1                                               squashfs                         /snap/bare/5
/dev/nvme0n1p3                                           ntfs                             (not mounted)                                                E694891B9488EF7D
/dev/nvme0n1p1                                           vfat            SYSTEM           /boot/efi                                                    D288-7E29
/dev/nvme0n1p4                                           ntfs            Recovery         (not mounted)                                                C6D28961D2895699
/dev/loop6                                               squashfs                         /snap/snapd-desktop-integration/10
/dev/loop4                                               squashfs                         /snap/snap-store/575
/dev/loop2                                               squashfs                         /snap/firefox/1232
/dev/loop0                                               squashfs                         /snap/core20/1405
/dev/loop7                                               squashfs                         /snap/snapd/15177
/dev/sda1                                                ext4                             /SSD                                                         6842d5c4-598b-445b-b172-6f6e223679fa
/dev/loop5                                               squashfs                         /snap/gtk-common-themes/1534
/dev/loop3                                               squashfs                         /snap/gnome-3-38-2004/99
/dev/nvme0n1p2                                                                            (not mounted)


#VIコマンドで開くと初期設定が出てくるので、末尾に追記する

rcat@rcat-Green-G5:~$ sudo vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme0n1p5 during installation
UUID=4344a6a1-ca75-4b5a-8a53-fb0962fae053 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=D288-7E29  /boot/efi       vfat    umask=0077      0       1
/swapfile                                 none            swap    sw              0       0

UUID=6842d5c4-598b-445b-b172-6f6e223679fa /SSD ext4 defaults 0 0

#mount -aを使うと書き込んだものが読み込まれマウントされる
rcat@rcat-Green-G5:~$ sudo mount -a

#容量確認コマンドで表示されるようになる
rcat@rcat-Green-G5:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.6G  2.2M  1.6G   1% /run
/dev/nvme0n1p5  329G   18G  296G   6% /
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/nvme0n1p1   96M   34M   63M  35% /boot/efi
tmpfs           1.6G   76K  1.6G   1% /run/user/1000
/dev/sda1       938G  385G  506G  44% /SSD

記述内容は以下の部分です
UUID=の後に確認したディスクのUUID、
どこにマウントするかのパス(先にフォルダを作っておく)
ディスクのフォーマット
オプションはdefaults。nofailを追加すると、起動時にマウント失敗しても無視してLinuxを起動する(これが無い場合は故障時や外したときにLinuxが立ち上がらなくなります)
最後の0 0はいつものらしいです。

UUID=26364bd3-0c84-4962-9e81-91a9059b6ef3 /SSD ext4 defaults,nofail 0 0

書き込み用VIコマンドの操作は以下

  1. 矢印で最下行に移動

  2. o
    末尾に行を挿入して記述

  3. 入力
    上の設定を直に書くか、Windowsでメモ帳などで作ってから貼り付け

  4. escキー
    抜けて

  5. ZZ
    上書き保存

終わったらsystemctl daemon-reload, mount -aで確認しましょう。

ソフトウェアRAIDを設定する

RAIDって?

今回4本のSSDを追加しているのにはもちろん理由があります。
RAIDは複数のディスクを一つのディスクとして扱える
機能です。RAID0-10までの種類があり、ミラーや分散など様々な方法があります。

  • RAID0 分散
    読み書きは早いが1個でも壊れると全データが消える。

  • RAID1 ミラー
    2本を1本として使う。片方壊れてもOK。

  • RAID5 分散パリティ
    3本以上で構成。1個分の容量を復旧用のパリティとして使うため、1本までなら壊れてもOK。分散なので読み込みが高速になる。
    RAID6は4本以上を使い2本まで壊れてもよい。

  • RAID10 分散ミラー
    4本で構成。RAID1のRAID0。ペアが同時に故障するとデータが消える。

今回のは今までのPCで使用してきていたディスクであり中古です。また、4本もあるとどこに何を入れるなど考えるのが面倒です。
使用時間も時間もバラバラですが、奇跡的に容量は同じ2Tです。というわけでRAIDを使って一つのディスクにします。
RAID5を採用するので、1個が壊れたとしても新しいのを差し替えれば復旧できる
という耐性付きです。

ツールのインストール

mdadmを使ってRAIDを構築していきます。

sudo apt update
sudo apt install mdadm

RAIDアレイを構築

以下のコマンドで仮想の一つのディスク"md0"を作ります。
最初のオプションから、新規作成、RAID"5"、再同期スキップ、デバイス数、使うデバイスです。
今回はまっさらなパーティションで組むので、再同期はスキップできます。

rcat@rcat-EVO-X2:~$ sudo mdadm --create --level=5 --assume-clean --raid-devices=4 /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/sdb1 appears to contain an ext2fs file system
       size=1953513472K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sdc1 appears to contain an ext2fs file system
       size=1953513472K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=1953513472K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=1953513472K  mtime=Thu Jan  1 09:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

次の進捗を確認します。
といってもスキップなので秒で終わってます。[UUUU]が完了の証らしい。

rcat@rcat-EVO-X2:~$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdd1[2] sdc1[1] sdb1[0]
      5860144128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 0/15 pages [0KB], 65536KB chunk

unused devices: <none>

フォーマットする

次のコマンドでRAIDをフォーマットします。

rcat@rcat-EVO-X2:~$ sudo mkfs.ext4 -F /dev/md0
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 1465036032 4k blocks and 183132160 inodes
Filesystem UUID: 48ac100c-4bd3-4d1b-8108-79453d4ef9dd
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

仕上げ

最後に自動マウントや認識がされるように永続化します。
RAIDの情報をコンフィグに書き込み。

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

マウントして確認。私はルート直下にフォルダ作る派です。
きちんと5.5Tで認識されてますね! (RAID5は1個のディスク容量分が復元用パリティに暗黙的に割り当てられる)

rcat@rcat-EVO-X2:~$ sudo mkdir /RAID
rcat@rcat-EVO-X2:~$ sudo mount /dev/md0 /RAID
rcat@rcat-EVO-X2:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           6.3G  2.4M  6.3G   1% /run
/dev/nvme0n1p5  1.4T  510G  795G  40% /
tmpfs            32G   28K   32G   1% /dev/shm
tmpfs           5.0M   16K  5.0M   1% /run/lock
efivarfs        128K   48K   76K  39% /sys/firmware/efi/efivars
/dev/nvme0n1p1   96M   68M   29M  71% /boot/efi
tmpfs           6.3G  108K  6.3G   1% /run/user/120
tmpfs           6.3G   96K  6.3G   1% /run/user/1000
/dev/sda1       938G  474G  417G  54% /SSD
/dev/md0        5.5T   28K  5.2T   1% /RAID

ここまでで完了なので、あとは一個の時と同じ感じでfstabに書き込んで終了。
ちなみにRAIDなので最後のところを2にしてチェックを入れるようにしました。
また、USB接続なのでnofailは必須です。

UUID=48ac100c-4bd3-4d1b-8108-79453d4ef9dd /RAID ext4 defaults,nofail 0 2

アレイからはじかれたとき

再起動後なぜかディスクが一個はじかれました。
sdaを外したのが悪かったんですかね?デバイス名で確かに追加しましたが、UUID云々って話が出なかったのでそれでずれるとは思えません。

マジで焦るですが

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [raid0] [raid1] [raid10]
md0 : active raid5 sdb1[1](F) sdc1[2] sda1[0] sdd1[3]
      5860144128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]
      bitmap: 2/15 pages [8KB], 65536KB chunk

一度外して止めます

$ sudo umount /dev/md0
$ sudo mdadm --stop /dev/md0

再アセンブルしますが、けられました

$ sudo mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/md0 has been started with 3 drives (out of 4).
$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [raid0] [raid1] [raid10]
md0 : active raid5 sda1[0] sdd1[3] sdc1[2]
      5860144128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]
      bitmap: 3/15 pages [12KB], 65536KB chunk

追加という形でやり直します。治りました。
終わったら仕上げの永続化を念のためやり直します。

$ sudo mdadm --add /dev/md0 /dev/sdb1
mdadm: re-added /dev/sdb1
$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [raid0] [raid1] [raid10]
md0 : active raid5 sdb1[1] sda1[0] sdd1[3] sdc1[2]
      5860144128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 3/15 pages [12KB], 65536KB chunk

コピースクリプトを書く

せっかくマウントしたので、自作のサービス関連をバックアップしようと思います。
Geminiに聞いたところrobocopyのようなコマンドとしてrsyncを紹介してくれましたので、これを使います。

sudo rsync -av --delete "$SOURCE_DIR" "$DEST_DIR"

これはコピー元とコピー先を比較して差分だけをコピー/削除するコマンドで、Windowsのrobocopy /MIRとほぼ一緒らしいです。
このコマンドを定期実行すれば完璧ですね。

Geminiが書いてくれました

#!/bin/bash
# コピー元ディレクトリ (末尾にスラッシュをつけることで中身をコピー)
SOURCE_DIR="/home/rcat/"
# コピー先ディレクトリ (ターゲットディレクトリが存在しない場合はrsyncが作成)
DEST_DIR="/SSD/backup/rcat"


# --- 2. フォルダのアクセス確認 ---
# コピー元ディレクトリの存在と読み取り権限を確認
if [ ! -d "$SOURCE_DIR" ]; then
    echo "エラー: コピー元ディレクトリ $SOURCE_DIR が見つかりません。"
    exit 1
fi

if [ ! -r "$SOURCE_DIR" ]; then
    echo "エラー: コピー元ディレクトリ $SOURCE_DIR への読み取りアクセス権がありません。"
    exit 1
fi

# コピー先ディレクトリのルート(/SSD/bk)の存在と書き込み権限を確認
# DEST_DIRの親ディレクトリ(/SSD/bk)が存在することをチェック
DEST_PARENT=$(dirname "$DEST_DIR")
if [ ! -d "$DEST_PARENT" ]; then
    echo "エラー: コピー先ルートディレクトリ $DEST_PARENT が見つかりません。先に作成してください。"
    exit 1
fi

if [ ! -w "$DEST_PARENT" ]; then
    echo "エラー: コピー先ルートディレクトリ $DEST_PARENT への書き込みアクセス権がありません。"
    exit 1
fi

# --- 3. コピーコマンド実行 ---

echo "バックアップを開始します: $SOURCE_DIR -> $DEST_DIR"
echo "----------------------------------------------------"

# rsyncコマンドを実行
# -a: アーカイブモード (属性保持)
# -v: 詳細表示 (省略可)
# --delete: ミラーリング (コピー元にないファイルをコピー先から削除)
# --dry-run: (テスト用) 実際にコピーせずに動作確認したい場合は、この行の先頭の#を外し、次の行の先頭に#をつけてください。
sudo rsync -av --delete "$SOURCE_DIR" "$DEST_DIR"

# 終了ステータスを確認
if [ $? -eq 0 ]; then
    echo "----------------------------------------------------"
    echo "バックアップが正常に完了しました。"
else
    echo "----------------------------------------------------"
    echo "エラー: rsyncが失敗しました。終了コード: $?"
    exit 1
fi
exit 0

VPNサーバー化する

下記で本機をVPNサーバー化し、外出先から本機や家庭内の機器にアクセスできるようにしました。
例えばWi-Fi環境下でローカルIPアドレスを入力して使う前提の機器がある場合、VPNを使うことで外からでもローカルIPアドレスで接続できるようになります。

SSL証明書を取得する

以下の記事で取得しているSSL証明書の自動更新を設定します。
当時はPython3.9仕様で使うのに一工夫必要でしたが、現在はたった3コマンドで実行可能です。
LINEのBotを作る際に必要です。

バックアップサーバー化する

Windows/Linux/Android対応のバックアップアプリのバックアップサーバーを作りました。
本PCは常時稼働しているので、Wi-Fi経由でいつでもバックアップができます。クラウドはアホみたいに高いが、オンプレなので容量単価激安!!
最新はVer2です。ぜひ使ってみてください。

MySQLインストール

今時私はDBでいろいろ管理しているので入れなおします。

音楽プレイヤーサーバー化する

イヤホンジャックが生かせていなかったので、シェルから音楽を流せるようにしてみました。
というかRcatはもうこの音楽プレイヤーに依存しているので必須です。
EVO-X2でも使えました(後ろのジャックを使います)

SMART監視

こちらの内容に沿ってSMARTの監視を行います。
SMARTはストレージの健康状態を監視するための物で、これを使うことでSSDの調子が悪い場合などに気付ける可能性があります。
今回からこれを少し改造して、このPCのオンプレAIで分析に変更します
また、RAIDの監視にも対応させます。

画像生成AIを動かしてみた

せっかくAI強になれたのでもう一度Stable Diffusionを動かしてみます。
前回はSDXLはメモリ上無理だったのですが、メモリは無駄に余ってますのでSDXLにアップグレードです。

環境構築やCPU/GPUでの生成速度はこちらでまとめていますので、興味のある方はこちらへ。

VOICEVOX API動かしてみた(さすが16C 32T爆速…)

こちらの記事で紹介している、Linux版のVOICEVOXをAPIをたたいて動かしてみます。

公式のAPIは結構複雑で面倒なので、自作の中間サーバーがありますのでこれをホストして実行します。

実行結果
約400文字を4秒程度で合成。ちなみにCPUでの演算です。さすがRyzen AI MAX+ 395、32Tの威力は伊達じゃない…。
これ、普通にLLMの出力流して音声として聞くことが実用レベルになりそう。

ゲームサーバー化してみた

マルチサーバーDiscord管理ツールの導入

マルチ用のサーバーを用意してくれているゲーム嬉しいんですが、ホストがPC落とすとやっぱりできませんよね?でも24H Linuxならどうでしょうか?
私オリジナルの管理ツールを使用し、Discordと連携することで管理者以外でもサーバーの起動や停止が可能な環境を構築することで誰でもやりたいときに稼働可能です。
詳しくは下記からサーバーの構築とツールの導入をしています。

なお、私の環境では少し書き換えてローカルLLMを使った指示を聞くように変更しています。

steamcmdのインストール

sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt install steamcmd

利用規約が出るので下まで進んで同意する。

これだけでstemadcmdコマンドが使えるようになるので、あとはいつも通りインストールをする。

(作業中)Difyセットアップ

自分でホスト & 最近はGeminiを直に呼び出すので入れないかもしれません

DifyはノーコードでAIツールを作れるツールです。
サーバー版とローカル版があり、ローカル版なら無料で無制限のAIツールを作成できます。そのローカル版のセットアップです。

その他(物理)

フィルター追加

見た感じ上が吸気で下が排気っぽいので、吸気側には部屋に転がっていたフィルターを追加しました。
ミニPCは分解清掃しづらい(というか30万分解したくない)のでこういうのが大事ですね。デザイン的にちょうどいい隙間ができていたものGOOD!

まとめ

今回はAIの為の化け物ミニPCを買って、Linuxをインストール後使用目的に合わせて初期セットアップをしていきました。
今後はこのPCを使って色々やっていきたいと思います。
買い換えたときに何をするのかのメモになるので、追加の項目があれば順次追記予定

リンク


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。