1. はじめに
この記事は Ubuntu 18.04 を lxc で構築する手順メモです。
ROS melodic を動作させる環境を確保するために lxc で構築したのですが、動作させたい環境が公式とは少し異なるため ROS melodic 環境を導入するまでは記述していません。
なお、ROS2 humble 向けに lxc で Ubuntu 22.04 環境構築を構築したメモはこちら。
構成は下記の通り。
項目 | |
---|---|
機種名 | HP Pavilion Aero 13-bg |
CPU | AMD Ryzen 7 8840U |
GPU | Radeon 780M |
RAM | 16 GB |
SWAP | 16 GB |
Host OS | Kubuntu 24.04 |
Host OS 側ユーザー名 | user |
Guest OS | Ubuntu 18.04 |
Guest OS 側ユーザー名 | ubuntu (デフォルト&変更可) |
2. 作業の流れ
3. lxd / lxc の準備
3.1. lxd / lxc のインストール
3.2. lxc の設定
3.3. GUI / Sound の共有
3.4. ディレクトリの共有(任意)
3.5. 設定の確認
4. コンテナ内環境構築
4.1. 基本パッケージ(日本語含む)のインストール
4.2. ssh の有効化
4.3. IP アドレスの固定
3. lxd / lxc の準備
コンテナ名を適宜決めて、一時的なシェル変数に設定。
ROS melodic を入れる前提のホスト名にしていますが、適宜変更してください。
LXCNAME=ros1-melodic
3.1. lxd / lxc のインストール
今は lxd は snap 側で管理されているため、snap によるインストール&初期設定。
lxd init での設定は、基本的にすべて default でも問題なし(好みで変更)
sudo snap install lxd
sudo lxd init
コンテナの作成(初回はダウンロードで少し時間がかかります)
sudo lxc launch ubuntu:18.04 $LXCNAME
3.2. lxc の設定
Host 側の UID/GID と共通化
(現在のアカウント以外と共通化する場合は適宜変更)
sudo lxc config set $LXCNAME raw.idmap "both $(id -u) $(id -g)"
3.3. GUI / Audio の共有
GUI, Audio の作業ディレクトリを Host 側と bind して共有
sudo lxc config device add $LXCNAME audio disk source=/run/user/1000/pulse/native path=/tmp/.pulse-native
sudo lxc config device add $LXCNAME xorg disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0
video グループの GID を gpu に割り当てて共有
sudo lxc config device add $LXCNAME gpu gpu gid=`getent group video | cut -d: -f3`
3.4. ディレクトリの共有(任意)
その他、Host 側とディレクトリを共有したい場合は適宜下記コマンドで追加
(e.g. Host 側 /home/user/Downloads, Guest 側 /home/ubuntu/Downloads を共有する場合)
sudo lxc config device add $LXCNAME share disk source=${HOME}/Downloads path=/home/ubuntu/Downloads
3.5. lxc 内で docker を動かす設定(任意)
lxc 内で docker を動かしたい場合は下記のコマンドでネストを有効化
sudo lxc config set $LXCNAME security.nesting true
3.6. インスタンスの自動起動を off にする(任意)
host 起動時に、毎回インスタンスを起動させたくない場合は以下のコマンドで抑制
(起動させたい場合は sudo lxc start $LXCNAME
による手動)
sudo lxc config set $LXCNAME boot.autostart=false
3.7. 設定の確認
以下で設定を確認できます。
both 1000 1000, audio, xorg, gpu など追加されていることが確認できます。
sudo lxc config show $LXCNAME
4. コンテナ内環境構築
コンテナ内で作業するため、bash を実行
(ログアウトするまでroot権限なので注意)
sudo lxc exec $LXCNAME /bin/bash
4.1. 基本パッケージ(日本語含む)のインストール
まずは最新の環境にまで upgrade
apt update && apt full-upgrade -y && apt autoremove -y
基本的なパッケージのインストール
apt install -y x11-apps pulseaudio dbus-x11 language-pack-ja fonts-noto-cjk-extra language-pack-gnome-ja-base language-pack-gnome-ja gnome-user-docs-ja gnome-control-center fonts-noto-color-emoji manpages-ja ibus-mozc
サウンドの設定
sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf
日本語設定/ロケール設定
update-locale LANG=ja_JP.UTF-8
timedatectl set-timezone Asia/Tokyo
localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
localectl set-x11-keymap jp jp106
source /etc/default/locale
dbus-uuidgen > /var/lib/dbus/machine-id
ubuntu ユーザーに切り替えて、ユーザー個別の設定
su - ubuntu
source /etc/default/locale
下記コマンドで ~/.profile に追記
cat << 'EOF' >> ~/.profile
export PULSE_SERVER=unix:/tmp/.pulse-native
export LANG=ja_JP.UTF8
EOF
ここまでの作業を確実に反映させるためコンテナの再起動
(Host 側に戻ります)
sudo reboot
4.2. ssh の有効化
ホストからゲストに ssh でログインするための鍵を作成
(すべて未指定の改行のみでもOKですが、気になる方は適宜指定を)
ssh-keygen -f ~/.ssh/${LXCNAME}
ここで作成された公開鍵(ros1-melodic.pub)の中身を後で使うので、画面上に表示やメモ帳などにコピーしておく(下記は cat で画面上に出力しているだけです)
cat ~/.ssh/${LXCNAME}.pub
ssh-ed25519 ABCDEFG...(略) user@host
Guest 側に移行
sudo lxc exec $LXCNAME /bin/bash
Guest 側に ssh をインストール
apt install ssh
鍵による認証を有効にするため /etc/ssh/sshd_config
の PubkeyAuthentication
のコメントアウトを外す
nano /etc/ssh/sshd_config
#PubkeyAuthentication yes
↓
PubkeyAuthentication yes
ユーザーを ubuntu
に切り替えた後、先程作成した公開鍵を ~/.ssh/authorized_keys
に保存する。
(先述の ssh-ed25519 ABCDEFG...(略) user@host
をそのまま ~/.ssh/authorized_keys
に書き込みでOK)
su - ubuntu
nano ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
ssh-ed25519 ABCDEFG...(略) user@host
権限の設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4.3. IP アドレスの固定
事前に lxdbr0 のネットワークアドレスを把握しておく。
ip a |grep lxdbr0 | grep inet
手元では出力結果が 10.169.78.1/24 でした。
inet 10.169.78.1/24 scope global lxdbr0
下記コマンドで IP アドレスの固定化を行う。
IP は先程確認したネットワークアドレス内で決める(今回は 10.169.78.101
とした)。
その後再起動。
sudo lxc network attach lxdbr0 ${LXCNAME} eth0 eth0
sudo lxc config device set ${LXCNAME} eth0 ipv4.address 10.169.78.101
sudo lxc restart ${LXCNAME}
コンテナにアクセスしやすいように、固定化したIPアドレスを登録させておく
echo "10.169.78.101 ${LXCNAME}" | sudo tee -a /etc/hosts > /dev/null
Host 側のユーザーで、ssh で Guest 側にアクセスする際の設定を行う。
~/.ssh/config をエディタで開き、下記を追記
(-X オプションをデフォルトで有効にするため ForwardX11 yes
を指定)
Host ros1-melodic
HostName ros1-melodic
ForwardX11 yes
User ubuntu
IdentityFile ~/.ssh/ros1-melodic
ssh 接続テスト
ssh ros1-melodic
正常に接続を確認できれば、環境構築完了です。