Featured image of post 開発用Serverの作成

開発用Serverの作成

目次

背景

  • 開発クライアントは以下のような問題があった
    • Windows
      • WLS2がHyperVのネットワークの問題によって動かなくなった
      • そこで、WSL1にダウングレードしたが色々と不便だった
    • Mac
      • 外国でMacBookの修理費が2倍かかった
      • MacBookが壊れつつもAppleの認定国で直す必要があった
    • Linux Desktop
      • KindleやMS Officeが使えなかったり不便だった
  • 結局、開発のクライアントはマルチの開発環境でやるしかない
  • なので、結局、開発機もClient-Server方式で構築する事にした
    • Client
      • Windows, Mac, Android, Linux Desktop
    • Server
      • Linux Server
  • そして、LANからはSSH、WANからVPNで接続して開発する
  • また、VSCodeを使ってSSH接続し、Client側もOS-freeにする
  • これによって外出先、自宅、別PCでも自由に開発ができるようにした

Install USBドライブの作成

  • Rufusを利用した
    • RufusはOSSの起動USBを作成するツール
    • 書き込みの設定はデフォルト
  • OSはUbuntu Server 24.04 LTS

Rufus

ServerへのUbuntuのインストール準備

  • BIOS
    • BootモードをLegacyに変更
    • USBドライブの優先度を一番上に変更
  • Boot USBドライブをPCに挿入して起動

ネットワーク情報の確認

ClientのLinux Desktopから、LANの情報を確認する。

  • ip a
    • NICのI/F
      • eth0, enp3s0, eno1
        • ethenで始まるので有線接続
      • wlan0, wlp3s0
        • wlで始まるので、WiFi
      • lo
        • ループバックインターフェイス
    • IP
      • inetに続くのがipアドレス
      • 192.168.3.11/24だった場合
      • 192.168.3.11がipアドレス
      • /24がサブネットネットマスク
  • ip r
    • default via 192.168.3.1 dev eno1の場合
    • 192.168.3.1がルーターのIPアドレス
    • これをデフォルトゲートウェイにする

つまり上の場合、固定IPをする時、次のような設定になる。

  • Address: 192.168.3.10 (かぶらないのを適当に選ぶ)
  • Network: 24 or 255.255.255.0 or 192.168.3.0/24
  • Gateway: 192.168.3.1
  • DNS: 8.8.8.8

ServerへのUbuntu Serverのインストール

WiFiの設定はStaticにする。

WiFIのPWの設定

DHCPの結果

WiFiのIPv4をStaticに変更

Static IPの結果

StorageはSSDが2枚あるが、1つにUbuntuをインストール

Storageの設定

Storageの設定2

Storageの設定3

プロファイルの設定

Profileの設定

SSHはもちろん有効化し、SSHの公開鍵はGithubからimportする。
ルーターのポートを空けていないので、便宜上形式にPWでログインも許可する。

SSHの設定

Snapsのソフトはいらないので、選択しない。

Feature Snapsの設定1

Feature Snapsの設定2

インストールする。

インストール中

SSHのテスト

Users > mike > .ssh > configに次のSSHの設定を追加する。

1
2
3
Host dev
    User                mike
    HostName            192.168.3.10

Client(Windows)から接続

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PS C:\Users\mike> ssh mike@dev
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Mon Nov 11 08:49:57 AM UTC 2024

  System load:             0.01
  Usage of /:              10.7% of 97.87GB
  Memory usage:            2%
  Swap usage:              0%
  Temperature:             36.0 C
  Processes:               270
  Users logged in:         1
  IPv4 address for wlp3s0: 192.168.3.11
  IPv6 address for wlp3s0: 2400:2412:3360:4d00:126f:d9ff:fe3c:6ef1


Expanded Security Maintenance for Applications is not enabled.

45 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


Last login: Mon Nov 11 08:46:29 2024 from 192.168.3.4

UFWの設定

簡便なのでUFWに切り替える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ sudo ufw allow 22
$ sudo ufw enable
$ sudo ufw reload
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             

SSHの鍵生成とGithubへの登録(Dev Server)

Dev Serverのsshキーを生成してGithubに登録する。

1
2
3
4
5
6
$ wget https://gist.githubusercontent.com/3265/54d0339408e8cd1898af6694b983736f/raw/c57bb85e9133fbd233c78ec58ad33a0044ea6b70/github.sh
$ sudo chmod +x github.sh
$ ./github.sh dev
$ # public keyをgithubに登録する。
$ ssh -T git@github.com
Hi 3265! You've successfully authenticated, but GitHub does not provide shell access.

以下がgithub.shの中味。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

# ref: https://stackoverflow.com/questions/43235179/how-to-execute-ssh-keygen-without-prompt

#!/bin/bash

# Check if argument is provided
if [ $# -ne 1 ]; then
    echo "Error: Please provide a name for the SSH key"
    echo "Usage: $0 <key-name>"
    exit 1
fi

KEY_NAME=$1

# Create .ssh directory if it doesn't exist
mkdir -p ~/.ssh/
cd ~/.ssh/

# Generate SSH key
yes | ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_${KEY_NAME}_rsa


if [ $? -ne 0 ]; then
    echo "Error: Failed to generate SSH key"
    exit 1
fi

# Set proper permissions
sudo chmod -R 700 ~/.ssh/
sudo chmod 600 ~/.ssh/id_${KEY_NAME}_rsa

# Add config entry
cat >> config <<EOF
Host github.com
    HostName            github.com
    IdentityFile        ~/.ssh/id_${KEY_NAME}_rsa
EOF

# Display public key
cat ~/.ssh/id_${KEY_NAME}_rsa.pub

基本的なパッケージのインスコ

システムの最新化。

1
2
$ sudo apt update
$ sudo apt upgrade -y

Dotfilesのセットアップ

dotfileの初期化に必要な必須パッケージのインスコ。

1
$ sudo apt install git make -y

clone

1
$ git clone git@github.com:3265/dotfiles.git

linuxの定番処理を走らせる。

1
2
$ cd dotfiles
$ make

pythonとnodeのインスコ

1
2
3
4
$ pyenv install 3.10.10
$ pyenv global 3.10.10
$ nvm install v22.1.0
$ nvm use v22.1.0

設定は全てDotfilesにある。

GPGキーの設定

既に設定済みのClientで鍵をExport

1
$ gpg --export-secret-key -a > secretkey.asc

Exportした鍵をServerに持っていって鍵の登録。

1
2
$ gpg --import secretkey.asc
$ shred --remove secretkey.asc

トラブルシューティング

1か月程して、下記のエラーでSSHのみ不通になった。

pcie_mp2_amd 0000:04:00.7: amd_sfh_hid_client_init fail led err -95

エラーの詳細を確認。

1
2
$ sudo dmesg | grep -i "amd_sfh_hid_client"
[   30.713035] pcie_mp2_amd 0000:04:00.7: amd_sfh_hid_client_init failed err -95

この問題は、AMD用のセンサーやHIDデバイスに関連するカーネルモジュールの問題。

Lunchpadによると、カーネルのバグっぽい。

1
2
$ uname -r 
6.8.0-49-generic

よって、amd_sfhドライバの無効化をする。

1
$ sudoedit /etc/modprobe.d/blacklist.conf

blacklist amd_sfhを追加する。

initramfsに反映する。

1
2
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0-49-generic

念のため、現在読み込まれているカーネルモジュールの確認。

1
2
3
4
$ lsmod | grep amd_sfh

amd_sfh                61440  0
hid                   180224  5 i2c_hid,hid_cmedia,usbhid,hid_generic,amd_sfh

その後、sudo rebootする。

再度確認。

1
$ lsmod | grep amd_sfh

何も表示されなかったので、無効化されたので、OK。

WindowsからSSH接続

ローカルからの接続はSSHキーでやるとPW入力が不要なので設定する。

1
2
3
4
5
6
7
PS C:\Users\mike\.ssh> ssh-keygen -t rsa -b 4096 -f id_dev_rsa
PS C:\Users\mike\.ssh> dir
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        11/25/2024   8:40 PM            360 config
-a----        11/25/2024   9:13 PM           3389 id_dev_rsa
-a----        11/25/2024   9:13 PM            748 id_dev_rsa.pub
1
2
PS C:\Users\mike\.ssh> cat .\id_dev_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCwT2oKpuqaKrKknzZL/7pL4cfq6g/dZvnz0NQhobkzA7WI8yE3prHlqDqeRYnz4ZEpjAFFdZIcN8S9PucV9U1xxBr6IHGER1EyBbBhZ+o1GnIeLSayIKAvlzLMUf+kM4+f3rwvCLPyGAnZUIFNapRJTefC4hQNapPU4be+RTCPhnjI32cZ7vcJdBTq63cPjhNdUNAgkv+9yMHwUyp6/v2V7FIXN+HQVWAOGmZuJuKMgE2ciRsil4b6XBtF3vu4I46slrPepbIuqGv3TCKUU+xQUHLTeqqUrDS+nIvnGJsqeTtnH1Dd0tHzBWD+c6Ii8gTb8o6UjtVCGg6sKQQxymsuHmSLVhQQpkuDqC4uwv4l1NcX1tQPhWnMb+kI+uqfzokS2LwYeCQxMJbTiZVe6toSF1E+4vmaXXxMqAAWQIrxCW4r7wgwjshQYHCuIajSZu9mY8I9ZvQQt4iyQZsbgNjXWz/aZwhnAO8/vOgFeF1y9UZs+ztO0yy9NpdP4nYsQHKwpKmxdrzhyvGPjoAb+wlozlGHB0XwXutmq5nPdfIXr9kg4J0w0s5hznG9pfoSbHqml1fSP8Whnj8ndRRvp7gHjrLOmuMkVAZo82Ny9I3Ux9lTTSu3RCc++aYhVakh5mlpI8MpOqsAIRl+//AYlGdJ31oPBz9EcdRzuRfBKmgarw== mike@DESKTOP-017FR51

configの設定

1
2
3
4
5
6
7
PS C:\Users\mike\.ssh> cat config
Host dev
    User                mike
    HostName            192.168.3.11
    IdentityFile        C:/Users/mike/.ssh/id_dev_rsa
    ServerAliveInterval 60
    ServerAliveCountMax 30

接続

1
2
PS C:\Users\mike\.ssh> ssh dev
$

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

XRDPのインスコ。

1
$ sudo apt install xrdp -y

xrdpの起動とportの設定。

1
2
3
$ sudo systemctl enable xrdp
$ sudo systemctl start xrdp
$ sudo ufw allow 3389

Windows(Client)でRemote Desktop Connectionを立ち上げてLinuxのUserで接続する。

  • Computer: 192.163.3.10
  • Username: xxx

TODOs

  • WireGuardの設定
  • RAIDの設定
  • fail2banの設定
  • NASの接続
  • ルーターの設定
  • DynamicDNSの設定
  • SSHFSやSFTPなどの設定
  • Linux Serverのフルバックアップ
  • リモートデスクトップの設定(RDP or VNC)
  • backupの設定

まとめ

  • マルチOSやマルチマシンを使いこなす必要がある開発では、開発環境もClient-Server方式で分離するのが良い
  • 同じLANにつないで入れば、スマホやiPadから開発サーバーもローカルIPアドレスのアクセスできるので便利
Built with Hugo
テーマ StackJimmy によって設計されています。