にわかプログラマの技術ブログ

C#しかまともに読めないにわか技術者。何かを作りたいわけじゃない。新しい技術を触りたいだけです。

ProxmoxにVyOSをインストールする手順

VyOSのISOダウンロード

公式から長期サポート用のISOが無料で配布されていない。しかし最新のISOであれば無料配布されている。

VyOS rolling release

ISOをダウンロードしてProxmoxにアップロードしてもいいし、Proxmox上でURLから直接ダウンロードしてもいい。

  • データセンター > (ホスト) > local (ホスト) > ISO イメージ

VyOSをProxmoxにインストール

設定項目に説明がない場合は デフォルト値 を使用している。メモリやディスクサイズは What are the hardware requirements for installing VyOS? の推奨スペックを参考にした。

  1. 右上の VMを作成 ボタンを押す
  2. 全般 タブの各項目を設定
    • VM ID : 作成後は変更不可仮想マシンの管理番号であり一意の値。
    • 名前 : 作成後は変更不可仮想マシンの名前。
  3. OS タブの各項目を設定
    • ISO イメージ : ISO イメージ 配置したVyOSのISOを選択
  4. システム タブの各項目を設定
    • すべてデフォルト値でいい (デフォルト値は、かならずしも既定ではない)
  5. ディスク タブの各項目を設定
    • ディスクサイズ (GiB) : 公式としては少なくとも 4 GB は必要とのこと。8 GB にした。
  6. CPU タブの各項目を設定
    • 種別 : kvm64 を選択。デフォルト値の x86-64系 だと仮想マシンが起動できずにエラーとなった。
  7. メモリ タブの各項目を設定
    • メモリ (MiB) : 公式としては少なくとも 1024 MB は必要とのこと。2048 MB にした。
  8. ネットワーク タブの各項目を設定
    • ブリッジ : ※ vmbr1 を選択。これは私のVyOS運用上の選択。
    • vmbr0Proxmox のIPが設定されており、ローカルネットワーク(192.168.11.0) につながる スイッチングハブ のようなものである。
    • 私の構想では Proxmox で作成するサーバーは、ローカルネットワーク(192.168.11.0) とは切り離された プライベートネットワーク(192.168.1.0) にしたい。
    • プライベートネットワーク(192.168.1.0)スイッチングハブ として vmbr1 を作成済みである。
    • プライベートネットワーク(192.168.1.0) 作成のための VyOS であるからして、ブリッジは vmbr1 なのである。
  9. 確認 タブの各項目を設定
    • 作成後に起動 にチェックを入れる
    • 内容を確認し、問題なければ 完了 を押す

VyOSの初回起動

VyOSが起動するとそのまま使用できそうではあるが、実のところこのままでは設定内容が再起動時に消えてしまう。以下よりVyOSがLive CDから起動していることが分かる。

そのため install image コマンドよりイメージをインストールする必要がある。

コマンドを実行すると、以下のように対話式で設定ができる。

  1. Would you like to continue? [y/N] → y
  2. What would you like to name this image? (Default: 1.5-rolling-XXXXXXXXXXXXXXXX) → Enter
  3. Please enter a password for the "vyos" user: → (vyos ユーザーのログインパスワード)
  4. Please confirm password for the "vyos" user: → (vyos ユーザーのログインパスワード)
  5. What console should be used by default? (K: KVM, S: Serial)? (Default: K) → Enter
  6. Which one should be used for installation? (Default: /dev/sda) → Enter
  7. Installation will delete all data on the drive. Continue? [y/N] → y
  8. Would you like to use all the free space on the drive? [Y/n] → Y
  9. Which file would you like as boot config? (Default: 1) → Enter

これで再起動しても設定内容が消えないようになる。(commit とか save が必要)

Proxmox VE 8.3のインストール方法

参考

qiita.com

USBメモリにProxmoxのインストールイメージを作成

  1. 以下より Proxmox VE 8.3 ISO Installer をダウンロード
  2. USBメモリにISOを書き込む

Proxmoxのインストール

  1. サーバーとなるPCにUSBメモリを挿入してインストーラーを起動
  2. Install Proxmox VE (Graphcal) を選択
  3. 利用規約に問題がなければ同意 (I agree)
  4. インストール先を指定して Next
  5. 地域設定・タイムゾーン設定・キーボードレイアウト設定して Next
  6. パスワード・メールアドレス設定して Next
  7. ネットワーク設定して Next
    • 私の家ではBuffaloのルーターを使用しているので 192.168.11.xxx とした
  8. 最終確認して Install
  9. インストールが完了すると自動で再起動になる
  10. 再起動後にProxmoxの管理URLが表示される
  11. ブラウザからアクセスする
    • ブラウザの警告は無視してアクセス
  12. root ユーザーでログインする
    • 意識低い私は日本語にする
  13. 「有効なサブスクリプションがありません」の警告が表示されるがOK (無料版の宿命)
  14. 管理画面が表示される

リポジトリの変更

初期設定では、有償版リポジトリが選択されているが、今回は有償版の契約をしないので、無償版のリポジトリに切り替える。

  1. 左上のホスト(インストール時のホスト名)を選択し、画面中央の リポジトリ を選択する。
  2. 追加 ボタンから、No-Subscription をプルダウンから選び追加する。
    • 右下部分の Enterprise の文字が含まれる2つのリポジトリDisable ボタンをクリックして無効化する。
  3. アップデート メニューへ
  4. 再表示 をクリックしてアップデート可能なパッケージを確認
  5. アップグレード をクリックしてアップグレード

Raspberry Pi にVirtualenvでPythonの仮想環境を構築する

(Raspberry Pi に限った話ではないのですけどね)

pipのインストール

Python3の開発用パッケージをインストール

$ sudo apt-get -y install python3-dev

Python3のpipをインストール

$ sudo apt-get -y install python3-pip

Virtualenv のインストール

# pipのアップグレード
$ pip3 install --upgrade pip

# Virtualenv のインストール
$ pip3 install virtualenv

仮想環境の作成

# 仮想環境の作成
$ python3 -m venv 〇〇

# 仮想環境のディレクトリが作成される
$ ls
〇〇

# 仮想環境のアクティブ化
$ source 〇〇/bin/activate

# 端末に ( ) で使用している仮想環境の名前が表示される
(〇〇) $

# 仮想環境のディアクティブ
(〇〇) $ deactivate

# 仮想環境の削除
# (プロジェクト直下に生成されたフォルダを、まるごと削除でOKです。)
$ rm -rf 〇〇

Raspberry Pi のネットワーク設定

ネットワーク設定ファイルの種類

OSによって使用する設定ファイルが異なるようです。以下はラズパイ(Raspberry Pi OS)の場合はのリストです。

パス メモ
wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf ルーターの指定はここ
dhcpcd.conf /etc/dhcpcd.conf IPの指定はここ
interfaces /etc/network/interfaces 昔はね、DHCPなのか静的IPかはここだったのよ
NetworkManager /etc/NetworkManager/system-connections/ Desktop版に入っているが...?
Netplan /etc/netplan/01-network-manager-all.yaml Ubuntuとかはこゆのもありました

wpa_supplicant

ラズパイではルーターの指定をするファイルです。ただしraspi-configから設定できるのでそちらを使うのがよろしいかと思います。

$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

# 追加
network={
  ssid="{myssid}"
  psk="{mypassphrase}"
}

dhcpcd.conf

ラズパイでのIPアドレスを設定するファイルです。

$ sudo nano /etc/dhcpcd.conf 
# Example static IP configuration:
interface eth0 # ネットワークインターフェースを指定します (無線LANの場合は wlan0)
static ip_address=192.168.0.212/24 # IPアドレスとサブネットを指定します
static routers=192.168.0.1 # ゲートウェイを指定します
static domain_name_servers=192.168.0.1 # DNSを指定します

# デスクトップ版のGUIから設定すると↓みたいになるので、SSIDも指定可能みたいです
SSID {myssid}
static ip_address=192.168.0.212/24 # IPアドレスとサブネットを指定します
static routers=192.168.0.1 # ゲートウェイを指定します
static domain_name_servers=192.168.0.1 # DNSを指定します
static domain_search=
noipv6

interfaces

最新のラズパイOSでは未使用であり、設定するとネットワークエラーとなるため注意してください。昔のラズパイではネットワークインターフェースがDHCPなのか静的IPなのか、また使用するネットワークインターフェースを指定するファイルだったみたいです。

$ sudo nano /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

# Ethernet port
auto eth0
iface eth0 inet static

# wifi port
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Raspberry Pi の環境構築手順メモ

前提条件

Raspberry Pi OS (Raspbian) を使用します。でもUbuntuであっても設定方法は違いますが、やりたいことは同じだと思います。

OSのイメージのSDカードへの書き込む

EtcherRaspberry Pi ImagerでOSのイメージのSDカードへの書き込みます。

環境設定

環境設定コマンドがあるので有難く使わせてもらいましょう。

$ sudo raspi-config

パスワードの変更

1 Change User Password を選択してデフォルトパスワードを変更します。

ホスト名の変更

2 Network Options > N1 Hostname を選択してホスト名を変更します。

Wi-Fiの設定

  1. 2 Network Options > N2 Wireless LAN を選択
  2. 初回は WLAN Country の選択が促されるので Japan を選択
  3. 4 Localisation Options > I4 Change WLAN Country から再設定できます
  4. 無線LANSSIDとパスワードを設定

ロケールの設定

日本語で使いたい場合は設定してください。テラタームなどで日本語になります。しかしraspi本体は文字化けします。

  1. 4 Localisation Options > I1 Change Locale を選択
  2. ja_JP.UTF-8 UTF-8 をスペースキーでチェックしてエンター
  3. システム全体のデフォルトロケールを尋ねられるので ja_JP.UTF-8 を選択

タイムゾーン

  1. 4 Localisation Options > I2 Change Timezone を選択
  2. Asia > Tokyo を選択

SSH serverの有効化/無効化

  1. 5 Interfacing Options - P2 SSH を選択

Would you like the SSH Server to be enabled?

  1. と聞かれるのでYesを選択
    • Noを選択した場合は無効となります

セキュリティ対策

1. デフォルトユーザーの「pi」を削除する

初期状態では、デフォルトユーザーの「pi」とパスワード「raspberry」が準備されています。がこれはインターネットに出回っているため外部公開する場合は危険です。よってオンリーワンなユーザーを作成してデフォルトユーザーの「pi」を削除します。

1-1. rootのパスワードを設定

初期状態では、スーパーユーザーのrootがパスワードで保護されていません。この状態では全ての操作がパスワード無しで実行可能となってしまいます。よってrootにパスワードを設定します。

$ sudo passwd root
Enter new UNIX password: #rootのパスワードを設定
Retype new UNIX password: #パスワードを再入力
passwd: password updated successfully

1-2. ユーザーの追加

$ sudo adduser 〇〇 # 〇〇というユーザーを追加
:
Enter new UNIX password: #新しく作成するユーザーのパスワードを設定
Retype new UNIX password: #パスワードの再入力
passwd: password updated successfully
Changing the user information for 〇〇
Enter the new value, or press ENTER for the default
    Full Name []: #入力の必要なければそのままEnter
    Room Number []: #同上
    Work Phone []: #同上
    Home Phone []: #同上
    Other []: #同上
Is the information correct? [Y/n] Y #「Y」と入力してEnter

1-3. 管理者権限の付与

piユーザーが属するグループを確認して同じグループに新規ユーザーを登録します。

 # piユーザーが属するグループを表示
$ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio

# 同じグループに新規ユーザーを登録
$ sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio 〇〇

# ラズパイからログアウトして新規ユーザーでログインできることを確認してください
$ exit

1-4. 新規ユーザーがパスワードなしでsudoを実行できるようにする

sudo 設定ファイルを以下のコマンドで開きます。

$ sudo visudo

以下を挿入して保存します

#includedir /etc/sudoers.d
〇〇  ALL=(ALL) NOPASSWD: ALL # 挿入

piユーザをsudoグループから外します

$ sudo gpasswd -d pi sudo
Removing user pi from group sudo

piユーザを削除します

# ユーザーを確認
$ id -a pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),999(spi),998(i2c),997(gpio)

# 削除
$ sudo userdel -r pi
userdel: group pi not removed because it has other members.
userdel: pi mail spool (/var/mail/pi) not found

# 削除されていることを確認
$ id -a pi
id: ‘pi’: no such user 

2. ログイン方式を公開鍵暗号方式にする

2-1. 鍵の作成

作成方法は色々ありますが、私はテラタームで作成しました。ラズパイではなく別のマシンでの作業なので省略しますが、作成した公開鍵id_rsa.pub秘密鍵id_rsaは決まったディレクトリに配置しないといけません。(Windowsマシンであろうとラズパイであろうと)

Windowsの場合はC:\Users\{ユーザー名}\.sshですし、ラズパイの場合は~/.sshです。

2-2. ラズパイに公開鍵を送信

公開鍵の転送先ディレクトリを作成します。

# ラズパイのホームディレクトリに.sshディレクトリを作成
$ mkdir ~/.ssh

そこに2-1. 鍵の作成で作成した公開鍵id_rsa.pubを配置します。私はテラタームを使って転送しました。

2-3. 公開鍵のパーミッションを変更

# パーミッションを700に変更
$ chmod 700 ~/.ssh

# id_rsa.pubの内容をauthorized_keysに書き込み
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# パーミッションを600に変更
$ chmod 600 ~/.ssh/authorized_keys

# 不要となったid_rsa.pubを削除
$ rm ~/.ssh/id_rsa.pub

2-4. SSHの設定ファイルを変更

# SSHの設定ファイル
$ sudo nano /etc/ssh/sshd_config

下記の5カ所を変更します

#Port 22
Port 61234 # SSHポート番号を変更#PermitRootLogin prohibit-password
PermitRootLogin no # rootでログインできないようにする#PubkeyAuthentication yes
PubkeyAuthentication yes # 公開鍵でログインできるようにする (デフォルトでなっているのでしょうけど)#PasswordAuthentication yes
PasswordAuthentication no # パスワードでログインできないようにする
#PermitEmptyPasswords no
PermitEmptyPasswords no # パスワードなしのログインを禁止する

2-5. SSHの再起動

sudo systemctl restart sshdSSHを再起動します

ステップアップ:SSH接続をスムーズに

.ssh(Windowsの場合はC:\Users\{ユーザー名}\.ssh)配下にconfigファイルを作成します。内容は以下

Host raspi
    HostName 192.168.XXX.XXX (場合によってはHostName.localとすることも)
    User {ラズパイのユーザー名}
    port {SSHのポート}
    IdentityFile {秘密鍵のパス}

コマンドプロンプトであれば以下のコマンドによりSSH接続することができます。

> ssh raspi

ステップアップ:ログを監視/通知する (Slackと連携) ※準備中...

ログファイルを監視し、SSH接続時にSlackへ通知を飛ばします。

Slack側の準備

SlackというチャットツールのIncoming Webhookを使用します。

監視プログラムを作成 (Python)

テスト実行

以下のコマンドで実行します

$ python3 run.py

SSHで接続すると通知がくることを確認します

ログアウト後も実行状態を継続させる

以下のコマンドで実行します

$ nohup python3 run.py > /dev/null 2>&1 &

プロセスの終了はkillコマンドからプロセスIDを指定して強制終了させます

# プロセスID確認
$ ps aux | grep run.py
# プロセス強制終了
$ kill 444

起動時に自動実行させる

# サービスの作成
$ sudo nano /etc/systemd/system/logmonitors.service
[Unit]
Description=Log Monitors

[Service]
ExecStart=/usr/bin/python3 /home/xxx

[Install]
WantedBy=multi-user.target
# systemdに登録
$ sudo systemctl enable logmonitors.service
# systemdに登録
$ sudo systemctl start logmonitors.service