背景
- 開発クライアントは以下のような問題があった
- Windows
- WLS2がHyperVのネットワークの問題によって動かなくなった
- そこで、WSL1にダウングレードしたが色々と不便だった
- Mac
- 外国でMacBookの修理費が2倍かかった
- MacBookが壊れつつもAppleの認定国で直す必要があった
- Linux Desktop
- KindleやMS Officeが使えなかったり不便だった
- 結局、開発のクライアントはマルチの開発環境でやるしかない
- なので、結局、開発機もClient-Server方式で構築する事にした
- Client
- Windows, Mac, Android, Linux Desktop
- Server
- そして、LANからはSSH、WANからVPNで接続して開発する
- また、VSCodeを使ってSSH接続し、Client側もOS-freeにする
- これによって外出先、自宅、別PCでも自由に開発ができるようにした
Install USBドライブの作成
- Rufusを利用した
- RufusはOSSの起動USBを作成するツール
- 書き込みの設定はデフォルト
- OSはUbuntu Server 24.04 LTS
ServerへのUbuntuのインストール準備
- BIOS
- BootモードをLegacyに変更
- USBドライブの優先度を一番上に変更
- Boot USBドライブをPCに挿入して起動
ネットワーク情報の確認
ClientのLinux Desktopから、LANの情報を確認する。
ip a
- NICのI/F
- eth0, enp3s0, eno1
- wlan0, wlp3s0
- 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にする。
StorageはSSDが2枚あるが、1つにUbuntuをインストール
プロファイルの設定
SSHはもちろん有効化し、SSHの公開鍵はGithubからimportする。
ルーターのポートを空けていないので、便宜上形式にPWでログインも許可する。
Snapsのソフトはいらないので、選択しない。
インストールする。
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の定番処理を走らせる。
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
する。
再度確認。
何も表示されなかったので、無効化されたので、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アドレスのアクセスできるので便利