見出し画像

ミニPC買ってみたので24H Linuxサーバー化する

こんにちは。Rcatです。
今までラズパイを24H稼働で使っていましたが、処理能力やメモリを考えてちゃんとしたパソコンを使うことにしました。
とはいえ、24H稼働だと電気代もかかるので、今回はミニPCというものに手を出してみました。
今後も設定追加したら追記していきます。

なにやるの?

この記事では次の事をやります


買ったもの

Amazonで"GREEN G5"というPCをプライム感謝祭の時に買いました。
まさかの2.8万でPCゲットです!

スペック

  • CPU N100
    電気代を考慮し、TDPの低いものを選びました。しかし、スコアは一昔前のi7並みのようです。

  • メモリ DDR5 16GB
    イマドキは16GB欲しいですよね

  • グラフィック
    CPU内蔵。HDMI x2と Type-Cに対応!
    しかもType-CがBIOS画面から使えたのには驚き。
    今までType-C画面使ったことないからかもしれないけどそういうモノなんですかね?

  • ストレージ
    M.2 500GB
    追加で2.5インチの場所もある

消費電力

こちらの記事を参照してください

Linux(Ubuntu)のインストール

以下のサイトを参考にデュアルブート前提のインストールをしました
https://www.pc-koubou.jp/magazine/35542

Ubuntuは以下から入手しました

インストールドライブの作成には"rufus"を使用しました。
ちなみにWindows11に対応していないPCに無理やり11書き込むときも、これを使ってWindows11インストールメディアを作ったりしました。


USBメモリはないので古のClass4 SDカードをUbuntuインストールメディアにしました。

インストールを完了したら、Linuxが起動するように起動構成を変更します。

最初は省略しちゃいましたが、BIOSのブートの画面で一番最初にSSDが来るように並び替えます。

最初のままだとWindowsブードマネージャーのままでインストールに失敗したかと思うんですが、下にある"UEFI NVME Drive BBS Priorities"のメニューを選択すると下の画面のようになるので、Bootオプションの一番をLinuxが来るように変更します。
こうすることでLinuxが立ち上がるようになります。

変更を保存して再起動をするとこの通り
インストールが完了しました。

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

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

アップデート

LANケーブルをさしておくと、アップデートの通知が来るのでボタンを押してアップデートしちゃいましょう。

SSHの有効化

SSHがないとリモート接続できないので入れておきます。
そもそもSSHとは、外部からコマンドラインにログインできる機能です。
Linuxはもともとコマンドが基本なので、画面には繋がずにこのSSHを使ってメインのWindowsPCから操作するものとします。

 sudo apt install openssh-server

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

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

TeraTermで接続

リモートでShellにアクセスするためにはTera Termを使います
OSをインストールする時にユーザーの作成をしていると思うので、それでログインしてみます。
IPアドレスはデスクトップのうちに、有線の設定から確認しておきましょう。
この後はリモートが基本になるので、IPアドレスは固定しておきましょう

Win SCPの接続

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

やることやっとく

適当にパッケージをインストール
Runlevelは下げとくと消費電力減るのかな?

$デフォルトのランレベルの変更(グラフィック無効化)
sudo systemctl set-default multi-user.target
$MP4BOX
sudo apt -y install gpac
$OpenCV用
sudo apt -y install libatlas-base-dev

aliasesを作る

いわゆるコマンドのショートカットですね。

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

Pythonの準備

さて、私はめちゃくちゃPythonを使うので、とりあえずよく使っているライブラリを片っ端から入れていきます。

sudo apt install python3-pip
$WEB/ネットワーク系
pip install flask
pip install flask_socketio
pip install cryptography
pip install ipget
$Discord系
pip install discord
$OpenCV
pip install opencv-python
$その他当たり前?レベル
pip install numpy

定期実行コマンド

アップデートをいちいちログインでやるのは面倒なので、毎日自動でコマンドを打ってもらいます。
今回用意したスクリプトが以下

apt -y update
apt -y upgrade

ルート権限がいるので、ルートで登録します。
最下行の部分がコマンドの部分で、毎日朝四時に実行する設定です。

rcat@rcat-Green-G5:~$ sudo crontab -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1
crontab: installing new crontab
rcat@rcat-Green-G5:~$ sudo crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
0 4 * * * /Rcat_Service/update.sh

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

次に自作サービス(スタートアップみたいなもの)を登録して、電源投入時に自動実行するサービスを作ります。
具体的にはDiscordのBOTやWEBサーバーなんかを実行します。
実行にはSystemdを用います。

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

毎回どうやって作るんだったっけ?と悩んでしまうので、スクリプトさえ用意すれば作れるようなコマンドを作成しました。
この辺の操作にはルート権限が必要なので、ルートで実行してください。
使い方は以下の通りです。

rcat@rcat-Green-G5:/Rcat_Service/Script/ESP32CAM$ CreateService ESP32CAM_Server_Ver2.py
[sudo] rcat のパスワード:
###サービス作成###

操作を選択
[1] 新規作成
[2] 既存のサービスファイルから作成

※本スクリプトはroot権限で実行してください


###画面クリアを挟む###


実行するPythonスクリプトは?
フルパスで入力してください

/Rcat_Service/Script/ESP32CAM/ESP32CAM_Server_Ver2.py
引数があれば入力

サービス名は?
ファイル名と同じ場合は空欄
R_ESP32CAM_Server_Ver2
ネットワークがオンラインであることを条件とする
(y/n)
y
標準出力をログに出力しますか?
(y/n)
y


###画面クリアを挟む###


以下の内容で作成します

--------------------------------------------

[Unit]
Description=R_ESP32CAM_Server_Ver2
After=network-online.target

[Service]
User=rcat
Type=simple
WorkingDirectory=/Rcat_Service/Script/ESP32CAM
ExecStart=/usr/bin/python3 /Rcat_Service/Script/ESP32CAM/ESP32CAM_Server_Ver2.py
StandardOutput=file:/Rcat_Service/Script/ESP32CAM/ESP32CAM_Server_Ver2.log

[Install]
WantedBy=multi-user.target network-online.target

--------------------------------------------
(y/n)

このスクリプトはユーザーの入力を受け付けて動く対話型のスクリプトです。最初にコマンドを起動して新規作成を選択します。
次に色々聞かれるので、順番通りに入力していくだけでサービスを作ることができます
ちなみに、最終的に出力するサービスファイルの内容は"私向け"の内容なので、人によっては合わないかもしれません。
ちなみにユーザーを自分にしている理由はルートで起動するとライブラリを読み込めないからです。別にrootでインストールしてもいいんですけど…。
その他にも一部のライブラリでユーザーの環境変数に依存している場合があるので、自分のユーザーで動作確認をしたなら絶対に動く自分のユーザーで実行という形にしました。
※追記:このスクリプトだけでは自動起動までもっていけてないので別途enableとrestartが必要です

ちゃんと登録されているか確認します。
"R_ESP32CAM_Server_Ver2"がいますね
スタートをかけてなかったので、手動でサービスのスタートをかけると、サービスがアクティブになっています。

rcat@rcat-Green-G5:/Rcat_Service/Script/ESP32CAM$ systemctl list-unit-files --type=service
(中略)
pulseaudio-enable-autospawn.service        masked          enabled
quotaon.service                            static          -
R_ESP32CAM_Server_Ver2.service             disabled        enabled
R_passwdserver.service                     enabled         enabled
rc-local.service                           static          -
rc.service                                 masked          enabled
rcS.service                                masked          enabled
(中略)

rcat@rcat-Green-G5:/Rcat_Service/Script/ESP32CAM$ sudo systemctl start R_ESP32CAM_Server_Ver2.service
rcat@rcat-Green-G5:/Rcat_Service/Script/ESP32CAM$ sudo systemctl status R_ESP32CAM_Server_Ver2.service
● R_ESP32CAM_Server_Ver2.service - R_ESP32CAM_Server_Ver2
     Loaded: loaded (/etc/systemd/system/R_ESP32CAM_Server_Ver2.service; disabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-10-21 15:23:57 JST; 22s ago
   Main PID: 3663 (python3)
      Tasks: 4 (limit: 18821)
     Memory: 45.8M
        CPU: 1.341s
     CGroup: /system.slice/R_ESP32CAM_Server_Ver2.service
             mq3663 /usr/bin/python3 /Rcat_Service/Script/ESP32CAM/ESP32CAM_Server_Ver2.py

1021 15:23:57 rcat-Green-G5 systemd[1]: Started R_ESP32CAM_Server_Ver2.
rcat@rcat-Green-G5:/Rcat_Service/Script/ESP32CAM$

ちなみに今回追加したサービスは下記で紹介している。ESP32CAMお手軽監視カメラシステムです。こういうの動かすために買ったんですよね。

欲しい人はこちらからどうぞ
https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=Linux_サービス作成

ざっとこんな感じでサービスが増えました。
分かりやすいように名前を全部"R_"から始めています。

DiscordのBOTも活動していることが確認できました。

追加SSDをマウント

この製品には2.5インチのスロットがあるので、前回使っていたSSDをそのまま差し替える

認識されているか確認してとりあえずマウントしてみる

rcat@rcat-Green-G5:~$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0  61.9M  1 loop /snap/core20/1405
loop1         7:1    0     4K  1 loop /snap/bare/5
loop2         7:2    0 155.6M  1 loop /snap/firefox/1232
loop3         7:3    0 248.8M  1 loop /snap/gnome-3-38-2004/99
loop4         7:4    0  45.9M  1 loop /snap/snap-store/575
loop5         7:5    0  81.3M  1 loop /snap/gtk-common-themes/1534
loop6         7:6    0   284K  1 loop /snap/snapd-desktop-integration/10
loop7         7:7    0  43.6M  1 loop /snap/snapd/15177
sda           8:0    0 953.9G  0 disk
mqsda1        8:1    0 953.9G  0 part
nvme0n1     259:0    0 476.9G  0 disk
tqnvme0n1p1 259:1    0   100M  0 part /boot/efi
tqnvme0n1p2 259:2    0   128M  0 part
tqnvme0n1p3 259:3    0 139.7G  0 part
tqnvme0n1p4 259:4    0   1.7G  0 part
mqnvme0n1p5 259:5    0 335.3G  0 part /


rcat@rcat-Green-G5:~$ sudo mkdir /SSD
[sudo] rcat のパスワード:
rcat@rcat-Green-G5:~$ sudo mount /dev/sda1 /SSD
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
rcat@rcat-Green-G5:~$

ちゃんと認識できたようです。
今までのバックアップデータが入っていました。

自動マウント

Linuxは挿しただけでは認識はするが読み書きできないのでマウントする
自動マウントには"fstab"を書き換える必要がある。
また、確実性を上げるために"UUID"を使う。
これをWinSCPで書き換えるのは少々面倒なので、Viコマンドで書き換える
WinSCPで書き換える場合は一旦rootでchmod777に変更する。

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)



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



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

VIコマンドの操作は以下

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

  2. escキー
    抜けて

  3. ZZ
    上書き保存

以上。VIコマンドは難しいのでキーストロークだけ書く。

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

本項は下記記事で別途紹介しています。
今流行りの生成AIを自分で試してみましょう。

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

過去に紹介済みではありますが、本PCでは初です。
今回はパルワールドをきっかけに本機でもゲームの専用サーバーを構築します。
私オリジナルの管理ツールを使用し、Discordと連携することで管理者以外でもサーバーの起動や停止が可能な環境を構築しています。
詳しくは下記からサーバーの構築とツールの導入をしています。

まとめ

今回はミニPCを買ってLinuxをインストール後使用目的に合わせて初期セットアップをしていきました。
今後はこのPCを使って色々やっていきたいと思います。

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