なるべく安全な方法
lxc.apparmor.profile = generated lxc.apparmor.allow_nesting = 1
とにかく権限を与える方法
上記で駄目な場合、以下ならほとんどのケースで起動可能。上記にlxc.cap.drop =を加えて、Dockerを起動できる場合もあり。lxc.apparmor.profile = unconfined lxc.cgroup.devices.allow = a lxc.cap.drop =
lxc.apparmor.profile = generated lxc.apparmor.allow_nesting = 1
lxc.apparmor.profile = unconfined lxc.cgroup.devices.allow = a lxc.cap.drop =
サイズ (B) | 説明 |
---|---|
6 | 送信先MAC |
6 | 送信元MAC |
[4] | 802.1Qタグ (VLANタグ) |
2 | Ethernet type/size. IPv4:0x0800, IPv6:0x86dd |
- | ペイロード(IPなど) |
4 | FCS (Frame Check Sequence; CRC) |
サイズ (B) | 説明 |
---|---|
1 | バージョン(MSB 4bit)、ヘッダ長(LSB 4bit) 4オクテット単位 |
1 | サービス種別 |
2 | 全長(IPヘッダを含む) |
2 | 識別子 |
2 | フラグ(MSB 3bit)、フラグメントオフセット(LSB 13bit) |
1 | TTL (Time to Live) |
1 | 上位プロトコル. ICMP: 0x01, TCP:0x06, UDP:0x11 |
2 | IPヘッダのチェックサム |
4 | 送信元アドレス |
4 | 送信先アドレス |
[2] | 拡張情報 |
- | データ |
サイズ (B) | 説明 |
---|---|
2 | 送信元ポート |
2 | 送信先ポート |
2 | データ長 |
2 | チェックサム |
- | ペイロード(IPなど) |
サイズ (B) | 説明 |
---|---|
2 | 送信元ポート |
2 | 送信先ポート |
4 | シーケンス番号 |
4 | 確認応答番号 |
2 | ヘッダ長(MSB 4bit)[32bit単位]、予約(3bit)、フラグ(9bit) |
2 | Windowサイズ |
2 | チェックサム |
2 | 緊急ポインタ |
[4-40] | オプション |
- | ペイロード |
オプション | 説明 |
---|---|
-s | TCP 1234番でGDBのリモートコクションをオープンします |
-S | GDBにアタッチされるまでゲストの実行を待機します。カーネルの起動後にアタッチしても問題ない場合、不要です。 |
sudo apt install linux-image-5.10.0-22-amd64-dbgあるいは、APT repositoryから直接取得する。
wget http://ftp.debian.org/debian/pool/main/l/linux/linux-image-5.10.0-22-amd64-dbg_5.10.178-3_amd64.deb sudo dpkg -i linux-image-5.10.0-22-amd64-dbg_5.10.178-3_amd64.deb
gdb /usr/lib/debug/vmlinux-5.10.0-22-amd64GDB起動後、以下のコマンドを実行する
(gdb) target remote [QEMU起動マシンのアドレス]:1234
(gdb) p jiffies $1 = 4295462764
(gdb) b do_sys_open Breakpoint 2 at 0xffffffff812d6ff0: do_sys_open. (11 locations) (gdb) c Continuing. Breakpoint 2.4, do_sys_open (mode=0, flags=557056, filename=0x7f153b8cabe7 "/etc/ld.so.cache", dfd=-100) at fs/open.c:1201 1201 fs/open.c: No such file or directory. (gdb) bt #0 do_sys_open (mode=0, flags=557056, filename=0x7f153b8cabe7 "/etc/ld.so.cache", dfd=-100) at fs/open.c:1201 #1 __do_sys_openat (mode=0, flags=557056, filename=0x7f153b8cabe7 "/etc/ld.so.cache", dfd=-100) at fs/open.c:1218 #2 __se_sys_openat (mode=0, flags=524288, filename=139729170115559, dfd=4294967196) at fs/open.c:1213 #3 __x64_sys_openat (regs=<optimized out>) at fs/open.c:1213 #4 0xffffffff818f7e00 in do_syscall_64 (nr=<optimized out>, regs=0xffffc9000027bf58) at arch/x86/entry/common.c:46 #5 0xffffffff81a000a9 in entry_SYSCALL_64 () at /build/linux-ts3hOX/linux-5.10.178/arch/x86/entry/entry_64.S:125
(gdb) set $curr = (struct task_struct **)($gs_base + (void *)¤t_task) (gdb) p $curr $2 = (struct task_struct **) 0xffff88803d01fbc0 (gdb) p $curr->comm $3 = "ls\000h\000\000\000)\000\000\000\000\000\000\000" (gdb) p $curr->pid $4 = 552上記について補足する。実行中のプロセスのtask_struct構造体へのポインタは、CPUごとの変数領域の中にあり、グローバル変数current_taskの値は、その領域におけるオフセットである。また、CPUごとの変数領域の開始位置はGSセグメントレジスタに格納されている。そのため、両者を加算したアドレス位置に実行中のプロセスに関するtask_struct領域へのポインタが格納されている。
-fsdev local,path=$(pwd),security_model=mapped-xattr,id=fsdev1 \ -device virtio-9p-pci,fsdev=fsdev1,mount_tag=tag1
mount -t 9p -o trans=virtio tag1 /mnt/dir_tag1 -oversion=9p2000.L
Category | 言語 | 数値型 | 時間 (sec) | 最大使用 物理メモリ (MiB) |
算出素数格納 コンテナ |
備考 | ||
---|---|---|---|---|---|---|---|---|
C1 | C2 | C1 | C2 | |||||
AOT Compile |
C | int | 12.6 | 7.5 | 23.6 | 23.6 | realloc() | gcc 12.2.0 最適化-O3 |
C | long | 41.6 | 12.5 | 45.5 | 45.6 | realloc() | 〃 | |
C++ | int | 12.7 | 7.7 | 36.5 | 36.5 | std::vector | 〃 | |
C++ | long | 41.9 | 12.5 | 67.6 | 68.7 | std::vector | 〃 | |
Rust | i32 | 14.2 | 7.6 | 25.8 | 24.0 | Vec | rust 1.63.0 | |
Rust | i64 | 14.1 | 7.6 | 46.2 | 46.0 | Vec | 〃 | |
Golang | int32 | 19.2 | 7.7 | 105.8 | 92.4 | slice | C1: Go 1.19.6, C2: Go 1.19.8 | |
Golang | int64 | 48.9 | 12.7 | 171.5 | 202.0 | slice | 〃 | |
JVM | Java | int (Integer) | 19.5 | 8.2 | 230.4 | 248.0 | ArrayList | 〃 |
Java | long (Long) | 53.0 | 13.3 | 269.1 | 294.1 | ArrayList | 〃 | |
Java (GraalVM) | int | 21.8 | 8.2 | 247.2 | 260.1 | ArrayList | GraalVM CE 22.3.2 | |
Java (GraalVM) | long | 49.3 | 13.2 | 281.2 | 306.4 | ArrayList | 〃 | |
Kotlin | Int | 19.6 | 8.1 | 256.1 | 276.6 | List | Kotlin 1.8.20 | |
Kotlin | Long | 51.8 | 13.1 | 294.1 | 323.0 | List | 〃 | |
Kotlin (GraalVM) | Int | 17.3 | 8.1 | 272.0 | 294.8 | List | Kotlin 1.8.20, GraalVM CE 22.3.2 | |
Kotlin (GraalVM) | Long | 46.6 | 13.1 | 310.2 | 330.9 | List | 〃 | |
Scala | Int | 24.9 | 9.5 | 1081.8 | 1449.0 | mutable.ArrayBuffer | Scala 3.2.2 | |
Scala | Long | 59.8 | 14.3 | 662.7 | 1430.6 | mutable.ArrayBuffer | 〃 | |
Scala (GraalVM) | Int | 19.3 | 8.2 | 245.0 | 321.8 | mutable.ArrayBuffer | Scala 3.2.2, GraalVM CE 22.3.2 | |
Scala (GraalVM) | Long | 50.8 | 13.4 | 609.8 | 706.0 | mutable.ArrayBuffer | 〃 | |
Script | JavaScript (Node.js) | Number | 17.3 | 7.8 | 196.1 | 203.2 | Array | Node.js 18.13.0 |
PHP | integer | 108.7 | 43.3 | 149.1 | 149.2 | array | PHP 8.2.2 | |
PHP (JIT) | integer | 71.9 | 13.4 | 152.4 | 152.5 | array | 〃 | |
Python3 | int | 289.4 | 160.0 | 231.5 | 232.8 | list | Python 3.11.2 | |
Ruby | Integer | 380.0 | 160.8 | 57.6 | 57.7 | Array | Ruby 3.1.2 |
Webブラウザで試験をしたり、GUIによるインタラクティブな処理をするなど、Linuxデスクトップを使いたい場合があります。一般的にLinuxデスクトップ(やベースシステムであるX11)はそのPCに装着されているビデオカードを使用します。そのため、コンテナのようにホストOSのビデオカードにアクセスできない環境ではGUIが基本的に使えません
この記事では、Linuxマシンのコンテナ内にXvfbという仮想的なグラフィックカードドライバを使ってLinuxデスクトップを作成する方法を紹介します。以下では、コンテナ内での設定・実行方法を前提に説明しますが、もちろんホストOS上でも「ソフトウェアのインストール・設定」項目以降の操作を行うことで同様に実行することが可能です。
下図のような構成を構築します。Xvfbは、仮想ビデオドライバを使用するX11サーバです。x11vncは、Xvfbの画面をVNCプロトコルに変換して、外部からVNCでアクセスできるようにするVNCサーバです。外部にVNCクライアントがあれば、この2つのソフトウェアでアクセスできます。
下図ではさらに、WebSockifyというソフトウェアを使用しています。これは、VNCをHTTPに変換するサーバです。つまり、VNCクライアントの変わりにWebブラウザでVNCサーバにアクセスできるようになります。
ここではコンテナイメージとして、Debian 11 (bullseye)を使用します。 また、LXCと使う場合と、Dockerを使う場合を紹介します。 LXCは、一度作成した環境を引き続き利用する場合に便利です。 Dockerはその環境を使い捨てで使用する場合に便利です。 コンテナの作成は、両者で若干異なりますが、ソフトのインストール方法や設定は同じです。
以下のコマンドをリモートマシンのホスト上で実行します。
sudo lxc-create -n mycontainer -t debian -- -r bullseye
sudo lxc-attach -n mycontainer bash
docker run --net host -it debian:11 bash上記では、ポートフォワードなどの設定を省略するために`--net host`を指定し、ホストOSのネットワークをそのままコンテナで使用します。セキュリティなどの理由で、ブリッジなどを使いたい場合、適宜変更ください。
apt update && apt install xvfb openbox x11vnc websockify novnc
xvfb-run -f ~/.Xauthority -n 10 -s "-screen 0 800x600x24" openbox上記の例では、openboxというWindow Managerを起動しています。他に使用したいWindows Managerやデスクトップ環境のプログラムがある場合、それを指定します。上記の紫色のパラメータがルートウィンドウの解像度と色深度です。これも必要に応じて変更ください。
Xvfb :10 -screen 0 800x600x24
x11vnc -display :10 -rfbport 5910 -forever -localhost上記の`-localhost`オプションは、localhostのみからVNC接続を許可するオプションです。WebSockifyを使わず、VNCクライアントでx11vncに直接アクセスする場合は、このオプションを削除ください。
websockify --web=/usr/share/novnc 8010 localhost:5910