「Bubblewrap/例」の版間の差分
(→Chromium: リンクを修正) |
(→Skype for Linux: リンクを修正) |
||
| (同じ利用者による、間の1版が非表示) | |||
| 273行目: | 273行目: | ||
{{Note|選択した UID と GID が {{ic|/etc/passwd}} と {{ic|/etc/groups}} にリストされている既存の値と競合しないことを確認してください。 |
{{Note|選択した UID と GID が {{ic|/etc/passwd}} と {{ic|/etc/groups}} にリストされている既存の値と競合しないことを確認してください。 |
||
| − | {ic|/etc/groups}} に記載されている既存の値と矛盾しないようにします。}} |
+ | {{ic|/etc/groups}} に記載されている既存の値と矛盾しないようにします。}} |
bwrap \ |
bwrap \ |
||
| 338行目: | 338行目: | ||
* 環境変数が全てアンセットされていることを確認します。 |
* 環境変数が全てアンセットされていることを確認します。 |
||
* ネットワークはホストと共有 ({{ic|--share-net}}), {{ic|/etc/resolv.conf}} は bind-mounted です. |
* ネットワークはホストと共有 ({{ic|--share-net}}), {{ic|/etc/resolv.conf}} は bind-mounted です. |
||
| − | * [Xorg] アクセス: {{ic|/tmp/.X11-unix/X0}} ソケットをバインドし、{{ic|$DISPLAY}} を設定します。 |
+ | * [[Xorg]] アクセス: {{ic|/tmp/.X11-unix/X0}} ソケットをバインドし、{{ic|$DISPLAY}} を設定します。 |
* [[D-Bus]]: {{ic|/run/user/$UID/bus}} ソケットを結び、{{ic|$DBUS_SESSION_BUS_ADDRESS}} を設定します。 |
* [[D-Bus]]: {{ic|/run/user/$UID/bus}} ソケットを結び、{{ic|$DBUS_SESSION_BUS_ADDRESS}} を設定します。 |
||
* Audio: [[PulseAudio]] ソケットをバインドしてください。 |
* Audio: [[PulseAudio]] ソケットをバインドしてください。 |
||
2023年2月27日 (月) 01:43時点における最新版
目次
dhcpcd
シンプルな dhcpcd のサンドボックスを作成:
- 利用可能なカーネル名前空間を確認:
$ ls /proc/self/ns cgroup ipc mnt net pid uts
- ホストの
/ディレクトリ全体を読み書き可能でサンドボックスの/にバインド。 - 新しい devtmpfs ファイルシステムをサンドボックスの
/devにマウント。 - 新しい IPC 名前空間とコントロールグループ名前空間を作成。
- 新しい UTS 名前空間を作成して
dhcpcdをホストネームとして設定。
# /usr/bin/bwrap --bind / / --dev /dev --unshare-ipc --unshare-cgroup --unshare-uts --hostname dhcpcd /usr/bin/dhcpcd -q -b
Unbound
粒度の細かい複雑な Unbound のサンドボックスを作成:
- システムの
/usrディレクトリを読み取り専用でサンドボックスの/usrにバインド。 - システムの
/usr/libディレクトリからサンドボックスの/lib64に対してシンボリックリンクを作成。 - システムの
/etcディレクトリを読み取り専用でサンドボックスの/etcにバインド。 - サンドボックスの中に空の
/varと/runディレクトリを作成。 - 新しい devtmpfs ファイルシステムをサンドボックスの
/devにマウント。 - 新しい IPC 名前空間と PID 名前空間とコントロールグループ名前空間を作成。
- 新しい UTS 名前空間を作成して
unboundをホストネームとして設定。
# /usr/bin/bwrap --ro-bind /usr /usr --symlink usr/lib /lib64 --ro-bind /etc /etc --dir /var --dir /run --dev /dev --unshare-ipc --unshare-pid --unshare-cgroup --unshare-uts --hostname unbound /usr/bin/unbound -d
Desktop
デスクトップエントリで bubblewrap を活用:
- ホストの
/ディレクトリ全体を読み書き可能でサンドボックスの/にバインド。 - サンドボックスの
/varと/etcディレクトリを読み取り専用で再バインド - 新しい devtmpfs ファイルシステムをサンドボックスの
/devにマウント。 - サンドボックスの
/runディレクトリに tmpfs ファイルシステムを作成。 - 新しいネットワーク名前空間を作成してネットワークアクセスを無効化。
[Desktop Entry] Name=nano Editor Exec=bwrap --bind / / --dev /dev --tmpfs /run --unshare-net st -e nano -o . %f Type=Application MimeType=text/plain;
mupdf.shシェルラッパーを組み込んだ MuPDF のデスクトップエントリの例:
[Desktop Entry] Name=MuPDF Exec=mupdf.sh %f Icon=application-pdf.svg Type=Application MimeType=application/pdf;application/x-pdf;
MuPDF
bwrap の能力と柔軟性が一番良くわかるのはシェルラッパーの中に環境を作成するときです:
- ホストの
/usr/binディレクトリを読み取り専用でサンドボックスの/usr/binにバインド。 - ホストの
/usr/libディレクトリを読み取り専用でサンドボックスの/usr/libにバインド。 - システムの
/usr/libディレクトリからサンドボックスの/lib64に対してシンボリックリンクを作成。 - サンドボックスの
/usr/lib/gccの上に tmpfs ファイルシステムを作成。- 上記の設定でサンドボックスから
/usr/lib/gccの中身を効率的に遮蔽できます。
- 上記の設定でサンドボックスから
- 新しい tmpfs ファイルシステムをサンドボックスの
$HOMEディレクトリとして作成。 .Xauthorityファイルと Documents ディレクトリをサンドボックスに読み取り専用としてバインド。- 上記の設定で
.Xauthorityファイルと Documents ディレクトリが再帰的にホワイトリストに追加されます。
- 上記の設定で
- 新しい tmpfs ファイルシステムをサンドボックスの
/tmpディレクトリとして作成。 - X11 ソケットをサンドボックスに読み取り専用としてバインドしてホワイトリストに追加。
- 実行中のカーネルによってサポートされている全ての名前空間に対してプレイベートなコンテナを複製・作成。
- カーネルが非特権のユーザー名前空間をサポートしてなかった場合、作成がスキップされます。
- ネットワークコンポーネントをプライベート名前空間に配置しない。
- 上記の設定で URI ハイパーリンクを辿ってネットワークにアクセスできます。
#!/bin/sh #~/bwrap/mupdf.sh (exec bwrap \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/lib /usr/lib \ --symlink usr/lib /lib64 \ --tmpfs /usr/lib/gcc \ --tmpfs $HOME \ --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ --ro-bind $HOME/Documents $HOME/Documents \ --tmpfs /tmp \ --ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \ --unshare-all \ --share-net \ /usr/bin/mupdf "$@")
$ bwrap \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/lib /usr/lib \ --symlink usr/lib /lib64 \ --tmpfs /usr/lib/gcc \ --tmpfs $HOME \ --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ --ro-bind $HOME/Desktop $HOME/Desktop \ --tmpfs /tmp \ --ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \ --unshare-all \ --share-net \ /usr/bin/sh bash-4.4$ ls -AF .Xauthority Documents/
bubblewrap によるファイルシステムを作成するときに一番重要なルールは実行されるコマンドの順番です。上記の MuPDF の例の場合:
- tmpfs ファイルシステムを作成してから
.Xauthorityファイルと Documents ディレクトリをバインドマウントした場合:
--tmpfs $HOME \ --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ --ro-bind $HOME/Documents $HOME/Documents \
bash-4.4$ ls -a . .. .Xauthority Documents
.Xauthorityをバインドマウントしてから tmpfs ファイルシステムを作成して上書きするとサンドボックスからは Documents ディレクトリだけが見えます:
--ro-bind $HOME/.Xauthority $HOME/.Xauthority \ --tmpfs $HOME \ --ro-bind $HOME/Documents $HOME/Documents \
bash-4.4$ ls -a . .. Documents
p7zip
既知の脆弱性 に対してパッチが適用されていないアプリケーションは特に bubblewrap を使用する価値があります:
- ホストの
/usr/bin/7za実行パスを読み取り専用でサンドボックスにバインド。 - システムの
/usr/libディレクトリからサンドボックスの/lib64に対してシンボリックリンクを作成。 - tmpfs オーバーレイでサンドボックス化した
/usr/lib/modulesと/usr/lib/systemdの中身をブラックリストに追加。 - 新しい devtmpfs ファイルシステムをサンドボックスの
/devにマウント。 - ホストの
/sandboxディレクトリを読み書き可能でサンドボックスの/sandboxディレクトリにバインド。- シェルラッパーから呼び出すことで 7za はホストの
/sandboxディレクトリとそのサブディレクトリの中でしか実行されなくなります。
- シェルラッパーから呼び出すことで 7za はホストの
- アプリケーションとプロセスのために新しい cgroup/IPC/ネットワーク/PID/UTS 名前空間を作成。
- カーネルが非特権のユーザー名前空間をサポートしていなかった場合、作成はスキップされます。
- 新しいネットワーク名前空間を作成することでサンドボックスからネットワークにアクセスできなくなります。
p7zipというホストネームをサンドボックスに追加。XAUTHORITY環境変数の設定を解除して X11 の接続クッキーの場所を遮蔽。- 7za を動作させるのに X11 ディスプレイサーバーに接続する必要はありません。
- 新しいターミナルセッションを起動してキーボードの入力がサンドボックス外に流出することを防止。
#!/bin/sh #~/bwrap/pz7ip.sh (exec bwrap \ --ro-bind /usr/bin/7za /usr/bin/7za \ --symlink usr/lib /lib64 \ --tmpfs /usr/lib/modules \ --tmpfs /usr/lib/systemd \ --dev /dev \ --bind /sandbox /sandbox \ --unshare-all \ --hostname p7zip \ --unsetenv XAUTHORITY \ --new-session \ /usr/bin/7za "$@")
bwrap \ --ro-bind /usr/bin/7za /usr/bin/7za \ --ro-bind /usr/bin/ls /usr/bin/ls \ --ro-bind /usr/bin/sh /usr/bin/sh \ --symlink usr/lib /lib64 \ --tmpfs /usr/lib/modules \ --tmpfs /usr/lib/systemd \ --dev /dev \ --bind /sandbox /sandbox \ --unshare-all \ --hostname p7zip \ --unsetenv XAUTHORITY \ --new-session \ /usr/bin/sh bash: no job control in this shell bash-4.4$ ls -AF dev/ lib64@ usr/ bash-4.4$ ls -l /usr/lib/modules total 0 bash-4.4$ ls -l /usr/lib/systemd total 0 bash-4.4$ ls -AF /dev console full null ptmx@ pts/ random shm/ stderr@ stdin@ stdout@ tty urandom zero bash-4.4$ ls -A /usr/bin 7za ls sh
Firefox
大規模な表面攻撃領域を持つネットワークに面したアプリケーションも、バブルラップの理想的な候補です。
- サンドボックスに含まれる Transmission は magnet と torrent のリンクで起動します。
- サンプルラップはオーディオ (PulseAudio) と印刷 (CUPS/Avahi) を GNOME (Wayland) 環境でサポートします。
~/.config/transmission/settings.jsonのパスは--setenv HOME変数を反映させる必要があります。
- 変数展開をサポートしない環境では、キーボードバインディングを可能にするためにフルパスが使用されます。
- Firefox#ハードウェアビデオアクセラレーション|WebRenderer]] とハードウェア (加速) コンポジットのサポートが含まれます。
bwrap \ --symlink usr/lib /lib \ --symlink usr/lib64 /lib64 \ --symlink usr/bin /bin \ --symlink usr/bin /sbin \ --ro-bind /usr/lib /usr/lib \ --ro-bind /usr/lib64 /usr/lib64 \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/lib/firefox /usr/lib/firefox \ --ro-bind /usr/share/applications /usr/share/applications \ --ro-bind /usr/share/gtk-3.0 /usr/share/gtk-3.0 \ --ro-bind /usr/share/fontconfig /usr/share/fontconfig \ --ro-bind /usr/share/icu /usr/share/icu \ --ro-bind /usr/share/drirc.d /usr/share/drirc.d \ --ro-bind /usr/share/fonts /usr/share/fonts \ --ro-bind /usr/share/glib-2.0 /usr/share/glib-2.0 \ --ro-bind /usr/share/glvnd /usr/share/glvnd \ --ro-bind /usr/share/icons /usr/share/icons \ --ro-bind /usr/share/libdrm /usr/share/libdrm \ --ro-bind /usr/share/mime /usr/share/mime \ --ro-bind /usr/share/X11/xkb /usr/share/X11/xkb \ --ro-bind /usr/share/icons /usr/share/icons \ --ro-bind /usr/share/mime /usr/share/mime \ --ro-bind /etc/fonts /etc/fonts \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --ro-bind /usr/share/ca-certificates /usr/share/ca-certificates \ --ro-bind /etc/ssl /etc/ssl \ --ro-bind /etc/ca-certificates /etc/ca-certificates \ --dir /run/user/"$(id -u)" \ --ro-bind /run/user/"$(id -u)"/pulse /run/user/"$(id -u)"/pulse \ --ro-bind /run/user/"$(id -u)"/wayland-1 /run/user/"$(id -u)"/wayland-1 \ --dev /dev \ --dev-bind /dev/dri /dev/dri \ --ro-bind /sys/dev/char /sys/dev/char \ --ro-bind /sys/devices/pci0000:00 /sys/devices/pci0000:00 \ --proc /proc \ --tmpfs /tmp \ --bind /home/example/.mozilla /home/example/.mozilla \ --bind /home/example/.config/transmission /home/example/.config/transmission \ --bind /home/example/Downloads /home/example/Downloads \ --setenv HOME /home/example \ --setenv GTK_THEME Adwaita:dark \ --setenv MOZ_ENABLE_WAYLAND 1 \ --setenv PATH /usr/bin \ --hostname RESTRICTED \ --unshare-all \ --share-net \ --die-with-parent \ --new-session \ /usr/bin/firefox
プライバシーの強化
- 特定のエントリを削除することで、さらに制限をかけることができます。
- 以下の項目を削除すると、オーディオのサポートが解除されます。
--ro-bind /run/user/"$(id -u)"/pulse /run/user/"$(id -u)"/pulse \
/sandboxは、任意のプロファイル情報を保持するためにユーザが定義した任意の場所を表します。- script/cron ジョブや手動で
/sandboxにコピーした Sanitized プロファイル を使用できるようにします。
- script/cron ジョブや手動で
$ cp -pR ~/.mozilla /sandbox/
場所は、ネットワーク共有、USB マウント、ローカルファイルシステム、または ramfs/tmpfs の場所 のいずれかです。
- 実際の
/home/exampleを見えなくするために/home/rを設定します。 - 新しいユーザ ID、グループ ID を設定する
bwrap \ .... --bind /sandbox/.mozilla /home/r/.mozilla \ --bind /sandbox/Downloads /home/r/Downloads \ ... --setenv HOME /home/r \ ... --uid 200 --gid 400 \ ... /usr/bin/firefox --no-remote --private-window
Chromium
wayland と pipewire を使ったシンプルな chromium サンドボックスです。
bwrap \
--symlink usr/lib /lib \
--symlink usr/lib64 /lib64 \
--symlink usr/bin /bin \
--symlink usr/bin /sbin \
--ro-bind /usr/lib /usr/lib \
--ro-bind /usr/lib64 /usr/lib64 \
--ro-bind /usr/bin /usr/bin \
--ro-bind /etc /etc \
--ro-bind /usr/lib/chromium /usr/lib/chromium \
--ro-bind /usr/share /usr/share \
--dev /dev \
--dev-bind /dev/dri /dev/dri \
--proc /proc \
--ro-bind /sys/dev/char /sys/dev/char \
--ro-bind /sys/devices /sys/devices \
--ro-bind /run/dbus /run/dbus \
--dir "$XDG_RUNTIME_DIR" \
--ro-bind "$XDG_RUNTIME_DIR/wayland-1" "$XDG_RUNTIME_DIR/wayland-1" \
--ro-bind "$XDG_RUNTIME_DIR/pipewire-0" "$XDG_RUNTIME_DIR/pipewire-0" \
--ro-bind "$XDG_RUNTIME_DIR/pulse" "$XDG_RUNTIME_DIR/pulse" \
--tmpfs /tmp \
--dir $HOME/.cache \
--bind $HOME/.config/chromium $HOME/.config/chromium \
--bind $HOME/Downloads $HOME/Downloads \
/usr/bin/chromium --enable-features=UseOzonePlatform --ozone-platform=wayland
- PipeWire です。
--ro-bind "/run/user/$(id -u)/pipewire-0" "/run/user/$(id -u)/pipewire-0" \.- PipeWire を使用しない場合、この行は削除してかまいません。
--bind $HOME/.config/chromium $HOME/.config/chromium \は、サンドボックス内のクロム設定ディレクトリを読み書き可能な状態にマウントします。--bind $HOME/Downloads $HOME/Downloads \は、サンドボックス内の ~/Downloads ディレクトリを読み書き可能な状態でマウントします。- この例はさらに改良して、より分離しやすくすることができます。
Skype for Linux
skypeforlinux-stable-binAUR /usr/bin/skypeforlinux の代わりに /usr/share/skypeforlinux/skypeforlinux で開始する必要があります。これは、後者がメイン プロセスをバックグラウンドでフォークし、--die-with-parent bwrap オプションと競合します。
次の例は、以下の機能を提供します。
- 環境変数が全てアンセットされていることを確認します。
- ネットワークはホストと共有 (
--share-net),/etc/resolv.confは bind-mounted です. - Xorg アクセス:
/tmp/.X11-unix/X0ソケットをバインドし、$DISPLAYを設定します。 - D-Bus:
/run/user/$UID/busソケットを結び、$DBUS_SESSION_BUS_ADDRESSを設定します。 - Audio: PulseAudio ソケットをバインドしてください。
- Video: デバイス
/dev/video0をディバインドします。
Skype プロファイルを保持するホスト上のディレクトリは、$HOST_PROFILE_PATH で構成できます。
env -i bwrap \
--ro-bind /usr /usr \
--dir /home/r \
--dir /tmp \
--dir /var \
--dir /run/user/$UID \
--proc /proc \
--dev /dev \
--symlink usr/lib /lib \
--symlink usr/lib64 /lib64 \
--symlink usr/bin /bin \
--symlink usr/sbin /sbin \
--symlink ../tmp /var/tmp \
--bind "$HOST_PROFILE_PATH" /home/r/.config/skypeforlinux \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \
--ro-bind /run/user/$UID/bus /run/user/$UID/bus \
--ro-bind /run/user/$UID/pulse /run/user/$UID/pulse \
--dev-bind /dev/video0 /dev/video0 \
--chdir / \
--unshare-all \
--share-net \
--hostname RESTRICTED \
--die-with-parent \
--new-session \
--setenv PATH /usr/bin \
--setenv HOME /home/r \
--setenv XDG_RUNTIME_DIR "/run/user/$UID" \
--setenv DISPLAY "$DISPLAY" \
--setenv DBUS_SESSION_BUS_ADDRESS "unix:path=/run/user/$UID/bus" \
/usr/share/skypeforlinux/skypeforlinux
Steam
シンプルな Steam サンドボックス
#!/usr/bin/bash
set -e
STEAM_HOME="$HOME/.local/share/steam_sandbox"
RUN_USER="/run/user/$UID"
mkdir -p "$STEAM_HOME"
_bind() {
_bind_arg=$1
shift
for _path in "$@"; do
args+=("$_bind_arg" "$_path" "$_path")
done
}
bind() {
_bind --bind-try "$@"
}
robind() {
_bind --ro-bind-try "$@"
}
devbind() {
_bind --dev-bind-try "$@"
}
args=(
--tmpfs /tmp
--proc /proc
--dev /dev
--dir /etc
--dir /var
--dir "$RUN_USER"
--bind "$STEAM_HOME" "$HOME"
--dir "$HOME"
--dir "$XDG_CONFIG_HOME"
--dir "$XDG_CACHE_HOME"
--dir "$XDG_DATA_HOME"
--dir "$XDG_STATE_HOME"
--symlink /usr/lib /lib
--symlink /usr/lib /lib64
--symlink /usr/bin /bin
--symlink /usr/bin /sbin
--symlink /run /var/run
)
robind \
/usr \
/etc \
/opt \
/sys \
/var/empty \
/var/lib/alsa \
/var/lib/dbus \
"$RUN_USER/systemd/resolve"
devbind \
/dev/dri \
/dev/nvidia* \
# steam
bind \
"$HOME/.Xauthority" \
"$HOME/.local/bin/proton" \
"$HOME/.pki" \
"$HOME/.steam" \
"$HOME/.steampath" \
"$HOME/.steampid" \
"$HOME/Downloads" \
"$RUN_USER"/.mutter-X* \
"$RUN_USER"/ICE* \
"$RUN_USER"/dbus* \
"$RUN_USER"/gnome* \
"$RUN_USER"/pipewire* \
"$RUN_USER"/pulse* \
"$RUN_USER"/wayland* \
"$RUN_USER/at-spi" \
"$RUN_USER/bus" \
"$RUN_USER/dconf" \
"$RUN_USER/systemd" \
"$XDG_CACHE_HOME/mesa_shader_cache" \
"$XDG_CACHE_HOME/nv" \
"$XDG_CACHE_HOME/nvidia" \
"$XDG_CACHE_HOME/radv_builtin_shaders64" \
"$XDG_CONFIG_HOME/Epic" \
"$XDG_CONFIG_HOME/Loop_Hero" \
"$XDG_CONFIG_HOME/MangoHud" \
"$XDG_CONFIG_HOME/ModTheSpire" \
"$XDG_CONFIG_HOME/RogueLegacy" \
"$XDG_CONFIG_HOME/RogueLegacyStorageContainer" \
"$XDG_CONFIG_HOME/cef_user_data" \
"$XDG_CONFIG_HOME/proton" \
"$XDG_CONFIG_HOME/pulse" \
"$XDG_CONFIG_HOME/unity3d" \
"$XDG_DATA_HOME/3909/PapersPlease" \
"$XDG_DATA_HOME/Colossal Order" \
"$XDG_DATA_HOME/Dredmor" \
"$XDG_DATA_HOME/FasterThanLight" \
"$XDG_DATA_HOME/HotlineMiami" \
"$XDG_DATA_HOME/IntoTheBreach" \
"$XDG_DATA_HOME/Paradox Interactive" \
"$XDG_DATA_HOME/PillarsOfEternity" \
"$XDG_DATA_HOME/RogueLegacy" \
"$XDG_DATA_HOME/RogueLegacyStorageContainer" \
"$XDG_DATA_HOME/Steam" \
"$XDG_DATA_HOME/SuperHexagon" \
"$XDG_DATA_HOME/Terraria" \
"$XDG_DATA_HOME/applications" \
"$XDG_DATA_HOME/aspyr-media" \
"$XDG_DATA_HOME/bohemiainteractive" \
"$XDG_DATA_HOME/cdprojektred" \
"$XDG_DATA_HOME/feral-interactive" \
"$XDG_DATA_HOME/frictionalgames" \
"$XDG_DATA_HOME/icons" \
"$XDG_DATA_HOME/proton" \
"$XDG_DATA_HOME/vpltd" \
"$XDG_DATA_HOME/vulkan" \
"/var/lib/bluetooth" \
/run/systemd \
/tmp/.ICE-unix \
/tmp/.X11-unix
exec bwrap "${args[@]}" /usr/lib/steam/steam "$@"
ファイルシステムの分離
(/var, /usr/bin, /usr/lib の中身など) ファイルシステムの中身を遮蔽しながらソフトウェアのインストールをサンドボックス化したい場合、pacman で Arch のパッケージを分離したファイルシステムツリーにインストールすることができます。
pacman を使ってソフトウェアをファイルシステムツリーにインストールするには、fakeroot と fakechroot のインストールが必要です。
例として pacman で xterm パッケージを隔離ファイルシステムツリーにインストールしたいとすると、ツリーを以下のように準備します:
$ MYPACKAGE=xterm
$ mkdir -p ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman
$ mkdir -p ~/sandboxes/${MYPACKAGE}/files/etc
$ cp /etc/pacman.conf ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf
~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf を編集して使用する pacman の設定を調整すると良いでしょう:
- 不必要なカスタムリポジトリやホスト環境でしか必要ない
IgnorePkg,IgnoreGroup,NoUpgrade,NoExtractの設定を削除。 CheckSpaceオプションを削除して pacman がディスク容量をチェックするために root ファイルシステムを検索するときのエラーを消す。
base グループと必須の fakeroot を分離ファイルシステムツリーにインストール:
$ fakechroot fakeroot pacman -Syu \
--root ~/sandboxes/${MYPACKAGE}/files \
--dbpath ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman \
--config ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf \
base fakeroot
同じオプションを使って bubblewrap を何度も呼び出すことになるので、以下のようにエイリアスを作成:
$ alias bw-install='bwrap \
--bind ~/sandboxes/${MYPACKAGE}/files/ / \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--tmpfs /tmp \
--proc /proc \
--dev /dev \
--chdir / '
ロケール を設定してください:
$ nano -w ~/sandboxes/${MYPACKAGE}/files/etc/locale.gen
$ bw-install locale-gen
pacman のキーリングを設定:
$ bw-install fakeroot pacman-key --init $ bw-install fakeroot pacman-key --populate archlinux
以下のように xterm パッケージをインストール:
$ bw-install fakeroot pacman -S ${MYPACKAGE}
pacman コマンドが失敗する場合、キーリングを生成するコマンドをもう一度実行してみてください。
これで xterm を含む分離ファイルシステムツリーが作られました。bw-install を使ってファイルシステムツリーをアップグレードすることができます。
bubblewrap でソフトウェアを実行することができます (上記の例では command は xterm になります):
$ bwrap \
--ro-bind ~/sandboxes/${MYPACKAGE}/files/ / \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--tmpfs /tmp \
--proc /proc \
--dev /dev \
--chdir / \
command
一部のファイルをパッケージ間で共有することもできます。既存のファイルシステムツリーのファイルのハードリンクを作成して新しいツリーで再利用することが可能です:
$ cp -al ~/sandboxes/${MYPARENTPACKAGE} ~/sandboxes/${MYPACKAGE}
bw-install fakechroot fakeroot pacman ... から pacman を呼び出して通常通りにインストールを行ってください。