1. 背景開発クライアントは以下のような問題があったWindowsWLS2がHyperVのネットワークの問題によって動かなくなった そこで、WSL1にダウングレードしたが色々と不便だった Mac外国でMacBookの修理費が2倍かかった MacBookが壊れつつもAppleの認定国で直す必要があった Linux DesktopKindleやMS Officeが使えなかったり不便だった 結局、開発のクライアントはマルチの開発環境でやるしかない なので、結局、開発機もClient-Server方式で構築する事にしたClientWindows, Mac, Android, Linux Desktop Server そして、LANからはSSH、WANからVPNで接続して開発する また、VSCodeを使ってSSH接続し、Client側もOS-freeにする これによって外出先、自宅、別PCでも自由に開発ができるようにした 2. Install USBドライブの作成Rufusを利用したRufusはOSSの起動USBを作成するツール 書き込みの設定はデフォルト OSはUbuntu Server 24.04 LTS
Rufus 3. ServerへのUbuntuのインストール準備BIOSBootモードをLegacyに変更 USBドライブの優先度を一番上に変更 Boot USBドライブをPCに挿入して起動 4. ネットワーク情報の確認ClientのLinux Desktopから、LANの情報を確認する。
ip a
NICのI/Feth0, enp3s0, eno1 wlan0, wlp3s0 lo IPinet
に続くのが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
5. 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 インストールする。
インストール中 6. SSHのテストUsers > mike > .ssh > config
に次のSSHの設定を追加する。
1
2
3
Host dev
User mike
HostName 192.168.3.10
Copy 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
Copy 7. 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)
Copy 8. 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.
Copy 以下が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
Copy 9. 基本的なパッケージのインスコシステムの最新化。
1
2
$ sudo apt update
$ sudo apt upgrade -y
Copy 10. Dotfilesのセットアップdotfileの初期化に必要な必須パッケージのインスコ。
1
$ sudo apt install git make -y
Copy clone
1
$ git clone git@github.com:3265/dotfiles.git
Copy 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
Copy 設定は全てDotfilesにある。
11. GPGキーの設定既に設定済みのClientで鍵をExport
1
$ gpg --export-secret-key -a > secretkey.asc
Copy Exportした鍵をServerに持っていって鍵の登録。
1
2
$ gpg --import secretkey.asc
$ shred --remove secretkey.asc
Copy 12. トラブルシューティング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
Copy この問題は、AMD用のセンサーやHIDデバイスに関連するカーネルモジュールの問題。
Lunchpad によると、カーネルのバグっぽい。
1
2
$ uname -r
6.8.0-49-generic
Copy よって、amd_sfhドライバの無効化をする。
1
$ sudoedit /etc/modprobe.d/blacklist.conf
Copy blacklist amd_sfh
を追加する。
initramfsに反映する。
1
2
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0-49-generic
Copy 念のため、現在読み込まれているカーネルモジュールの確認。
1
2
3
4
$ lsmod | grep amd_sfh
amd_sfh 61440 0
hid 180224 5 i2c_hid,hid_cmedia,usbhid,hid_generic,amd_sfh
Copy その後、sudo reboot
する。
再度確認。
何も表示されなかったので、無効化されたので、OK。
13. 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
Copy 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
Copy 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
Copy 接続
1
2
PS C: \ Users \ mike \. ssh > ssh dev
$
Copy 14. リモートデスクトップ接続の設定XRDPのインスコ。
1
$ sudo apt install xrdp -y
Copy xrdpの起動とportの設定。
1
2
3
$ sudo systemctl enable xrdp
$ sudo systemctl start xrdp
$ sudo ufw allow 3389
Copy Windows(Client)でRemote Desktop Connectionを立ち上げてLinuxのUserで接続する。
Computer: 192.163.3.10 Username: xxx 15. TODOsWireGuardの設定 RAIDの設定 fail2banの設定 NASの接続 ルーターの設定 DynamicDNSの設定 SSHFSやSFTPなどの設定 Linux Serverのフルバックアップ リモートデスクトップの設定(RDP or VNC) backupの設定 16. まとめマルチOSやマルチマシンを使いこなす必要がある開発では、開発環境もClient-Server方式で分離するのが良い 同じLANにつないで入れば、スマホやiPadから開発サーバーもローカルIPアドレスのアクセスできるので便利