メインコンテンツへスキップ
見出し画像

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

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

    新しいミニPCを購入しLinuxサーバー化しました。
    一部の手法は改善したり新しいことをしていたりするので、まずはこちらご覧ください。
    下記で"今回はやりません"と書いてあることはこの記事を見てください。

    なにやるの?

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

    買ったもの

    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
    $Androidアプリ開発用パッケージ
    sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
    pip3 install --user --upgrade Cython==0.29.19 virtualenv
    pip install buildozer
    $MySQL(データベース)サーバー
    sudo apt install mysql-server


    aliasesを作る

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

    画像

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

    画像

    Pythonの準備

    さて、私はPythonを使うので、適当にインタプリタ起動して使うためにとりあえずよく使っているライブラリを入れていきます。
    ※システムに入れたくない場合はvenvを使ってください

    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
    

    ファイアウォール設定

    Ubuntuには標準でufwが入っているのでこれを使います。
    ただしデフォルトでは無効なので手動でオンにする必要があります。

    #状態を確認
    sudo ufw status
    状態: 非アクティブ
    
    #先にsshを開けておく
    sudo ufw allow ssh
    
    #有効化する
    sudo ufw enable
    #SSHから接続していると切れるかもよ?って警告が出るのでy
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    ファイアウォールはアクティブかつシステムの起動時に有効化されます。
    
    #ポートを開放の例(httpサーバー)
    sudo ufw allow 80

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

    次に自作サービス(スタートアップみたいなもの)を登録して、電源投入時に自動実行するサービスを作ります。
    具体的には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)

    このスクリプトはユーザーの入力を受け付けて動く対話型のスクリプトです。最初にコマンドを起動して新規作成を選択します。
    次に色々聞かれるので、順番通りに入力していくだけでサービスを作ることができます。
    ちなみに、最終的に出力するサービスファイルの内容は"私向け"の内容なので、人によっては合わないかもしれません。
    ※追記:このスクリプトだけでは自動起動までもっていけてないので別途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
    
    10月 21 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/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=Linux_サービス系

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

    画像

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

    画像

    追加SSDをマウント

    この製品には2.5インチのスロットがあるので、前回使っていたSSDをそのまま差し替える。
    ちなみにねじ穴がズレていてねじは使えなかった…w

    画像

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

    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:~$

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

    画像

    追記:このSSD死にました。

    自動マウント

    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コマンドは難しいのでキーストロークだけ書く。

    VPNサーバー化する

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

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

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

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

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

    Difyセットアップ

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

    AIを使う例としてはこちらの作品があります。
    SNSから得た情報をAIを使って全自動分析します。

    モバイル回線を併用する

    USBテザリングを用いて、特定のサイトだけモバイル回線経由でアクセスする方法の検討と、設定の自動化を下記記事で行っております。

    Bluetoothを使う

    今回インストールしたUbuntu 22.04.5 LTSにはこのPCで採用されているBluetoothとWi-Fi用のデバイスドライバが存在しないようで、使おうとしてもエラーになります。
    ただし同系統のチップのドライバを当てることで使えるようなのでその方法で有効化しました。
    詳しくは以下の記事のBluetoothテザリングのセクションで紹介しています。

    MySQLインストール

    AIを使った自動SNS分析で使用するためにデータベースを導入しました。

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

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

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

    イヤホンジャックが生かせていなかったので、シェルから音楽を流せるようにしてみました。

    まとめ

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

    というか随時追記中。


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ