ビルドのみ(テストしない)
./gradlew build -x test
指定のテストを実行
./gradlew test --tests "SomeTest.*"
./gradlew build -x test
./gradlew test --tests "SomeTest.*"
# stty size 25 80これを実際の仮想端末のサイズにフィットするには以下のコマンドを実行する
# setterm --resizeすると、ターミナルサイズが変更される
# stty size 51 204
# lxc-create -t debian -n deb12 -- -r bookworm debootstrap is /usr/sbin/debootstrap Checking cache download in /var/cache/lxc/debian/rootfs-bookworm-amd64 ... gpg: key 7638D0442B90D010: 4 signatures not checked due to missing keys gpg: key 7638D0442B90D010: "Debian Archive Automatic Signing Key (8/jessie)次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。" not changed gpg: Total number processed: 1 gpg: unchanged: 1 Downloading debian minimal ... I: Retrieving InRelease I: Checking Release signature E: Release signed by unknown key (key id F8D2585B8783D481) The specified keyring /var/cache/lxc/debian/archive-key.gpg may be incorrect or out of date. You can find the latest Debian release key at https://ftp-master.debian.org/keys.html Failed to download the rootfs, aborting. Failed to download 'debian base' failed to install debian lxc-create: deb12: lxccontainer.c: create_run_template: 1627 Failed to create container from template lxc-create: deb12: tools/lxc_create.c: main: 317 Failed to create container deb12
wget https://ftp-master.debian.org/keys/archive-key-12.asc -O - --quiet \
| gpg --import --no-default-keyring --keyring=/usr/share/keyrings/debian-archive-keyring.gpg
青字の部分は使用するDebianのバージョンに適宜変更する。鍵の一覧は以下のサイトにある。
https://ftp-master.debian.org/keys.html
$ cvt 1280 800 # 1280x800 59.81 Hz (CVT 1.02MA) hsync: 49.70 kHz; pclk: 83.50 MHz Modeline "1280x800_60.00" 83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync上記の出力を引数にxrandr --newmode、--admode、-sを実行する。
xrandr --newmode 1280x800 83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync xrandr --addmode screen 1280x800 xrandr -s 1280x800
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
言語 | 時間 (sec) | 最大使用物理メモリ(MiB) | 算出素数格納コンテナ | 補足情報 | 感想 |
---|---|---|---|---|---|
C | 12.6 | 25.1 | 固定長配列 | gcc 12.2.0 最適化-O3 |
- |
C | 12.6 | 23.9 | realloc() | gcc 12.2.0 最適化-O3 |
固定長配列よりメモリ使用量が少ないが、処理時間は同じ。ある程度、数が大きくなると新しい素数の追加が少なくなるからか。 |
C++ | 66.5 | 36.5 | std::vector | gcc 12.2.0 最適化なし(-O0でビルド) |
- |
C++ | 12.7 | 35.6 | std::vector | gcc 12.2.0 最適化(-O3でビルド) |
最適化するとやはりかなり速くなる。メモリ使用量もC言語とRust以外の言語と比べて圧倒的に少ない |
Rust | 14.2 | 23.9 | Vec | 1.63.0 | C++に匹敵する速さ。メモリ消費はむしろ少ない。それでいて安全性が高いとくれば次世代の主役の可能性あり |
JAVA | 19.5 | 228.9 | ArrayList | OpenJDK 17.0.6 | C/C++の約1.5倍の実行時間。これまでの経験ともだいたい整合する |
Kotlin | 19.6 | 256.2 | List | Kotlin 1.8.20 | Javaと同等。コードの書きやすさを考えると悪くない選択肢 |
Scala | 24.9 | 1078.4 | mutable.ArrayBuffer | Scala 3.2.2 | 速度面ではJavaと比較してやや劣る程度だが、メモリ使用量がJavaの約4倍、C++の30倍近い。 |
Golang | 48.9 | 168.1 | slice | go1.19.6 | 予想より速くない。メモリ使用量もJavaの半分程度で、この結果だけだと使いみちが中途半端となるかも。 |
Node.js | 17.3 | 196.1 | Array | v18.13.0 | JavaやScalaを凌駕。メモリ使用量もそれらよりやや少ない。 |
PHP | 109.5 | 149.4 | array | PHP 8.2.2 | 特に良いところもないような。無理に使うような言語ではないと思う。 |
Python3 | 289.4 | 231.5 | list | 3.11.2 | 圧倒的に遅い。メモリ使用量は他のスクリプトと同程度。直接アルゴリズムを組んでごりごりやる言語ではない。今回の評価観点は一番不向きな用途だろう。 |
ssh remote tar czf - /home/foo > foo.tar.gz
上記の青字の部分は、リモートマシンで実行されるコマンドである。リモートで実行したコマンドの標準出力は、ローカルのsshコマンドそのものの標準出力に出力される。上記でtarの出力ファイルとして-(標準出力)を指定しているので、結果としてローカルのsshの標準出力にtarアーカイブの内容が出力される。そこで> foo.tar.gzでローカルのファイルにリダイレクトすれば、そのままtarアーカイブとなる。これを図にすると次のイメージである。
なお、標準入出力については下記を参照。
また、tarをカレントディレクトリが/home/fooで実行させるには以下のようにする。
ssh remote "(cd /home/foo; tar czf - .)" > foo.tar.gz
ssh -J remote remote2 tar czf - /home/goo > goo.tar.gz
# lxc-create -n name -t debian -- -r bookworm
他のバージョンをインストールする場合、上記の青字の部分を下のcode nameに置換する。
version | code name |
---|---|
10 | buster |
11 | bullseye |
12 | bookworm |
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:53 ? 00:00:00 /sbin/init root 39 1 0 18:53 ? 00:00:00 /lib/systemd/systemd-journald root 63 1 0 18:53 ? 00:00:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0 root 85 1 0 18:54 ? 00:00:00 /usr/sbin/sshd -D root 86 1 0 18:54 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:55 ? 00:00:00 /sbin/init root 38 1 0 18:55 ? 00:00:00 /lib/systemd/systemd-journald root 63 1 0 18:55 ? 00:00:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0 root 89 1 0 18:55 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 root 90 1 0 18:55 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:59 ? 00:00:00 /sbin/init root 38 1 0 18:59 ? 00:00:00 /lib/systemd/systemd-journald root 70 1 0 18:59 ? 00:00:00 dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.le root 97 1 0 18:59 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud - 115200,38400,9600 vt220 root 98 1 0 18:59 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
prog2: main.o sub.o
gcc -o $@ $^
%.o: %.c
gcc -c -o $@ $<
main.o: main.c sub.h
sub.o: sub.c sub.h
ここで青字で示されるパターンルールをMakefileから削除してみます。
prog2: main.o sub.o gcc -o $@ $^ main.o: main.c sub.h sub.o: sub.c sub.hこのMakefileをカレントディレクトリに配置してmakeを実行します。
$ make cc -c -o main.o main.c cc -c -o sub.o sub.c gcc -o prog2 main.o sub.oなんと、このMakefileでもビルドが成功します。 とくに驚くべきことは、*.cから*.oを作成する方法を指定しなていにもかかわらず、コンパイルが実行されています。 実は、makeはデフォルトのパータンルールを持っており、パターンルールが明示されていない場合、そのデフォルトのルールが使用されます。 このパターンルールを組み込みルールと呼びます。
$(CC) $(CPPFLAGS) $(CFLAGS) -cさらに、上記の変数の$(CC)なども組み込みのデフォルト値があります。以下に記載されています。 上記のサイトに記載されている、それぞれの変数のデフォルト値を以下に示します。
変数 | デフォルト値 |
---|---|
CC | cc |
CPPFLAGS | (なし) |
CFLAGS | (なし) |
CFLAGS = -g3 -O2
prog2: main.o sub.o
gcc -o $@ $^
main.o: main.c sub.h
sub.o: sub.c sub.h
このMakefileを使ってmakeを実行すると以下のようにCFLAGSに設定したオプションが付与されています。
cc -g3 -O2 -c -o main.o main.c cc -g3 -O2 -c -o sub.o sub.c gcc -o prog2 main.o sub.o
本記事では、組み込みルールについて説明しました。
以下には、make入門の全記事がリストアップされています。
escape ^Tt
startup_message off
# %` : バクチクコマンドの結果 # %-w : カレントウィンドウより前のウィンドウリスト # %{= wk} : w: 白, k: 黒 (1つ目文字と2つ目の文字は、それぞれ前景色と背景食) # %n : ウィンドウ番号 # %{-} : 色をリセット # %n : ウィンドウタイトル # %+w : カレントウィンドウより後のウィンドウリスト caption always "%?%F%{= Wk}%:%{= wK}%? %`%-w%?%P%{= b.}%:%{= k.}%?%?%F%{= .C}%:%{= wk}%?%50> %n %?%F%{= .W}%:%{= wk}%?%?%t %?%?%F%{= Wk}%:%{= wK}%?%+w %<"上記の設定によるステータスラインの例。白い背景色のラインで、カレントウィンドウは白黒を反転。ウィンドウ番号は水色。
hardstatus ignore
encoding utf8
defscrollback 1024
bind r eval 'echo Resize window' 'command -c resize' bind -c resize ^] command bind -c resize k eval 'resize +1' 'command -c resize' bind -c resize j eval 'resize -1' 'command -c resize' bind -c resize l eval 'resize +1' 'command -c resize' bind -c resize h eval 'resize -1' 'command -c resize' bind _ resize max bind = resize = bind w focus bind j focus down bind l focus right bind k focus up bind h focus left bind K kill
bind s bind ^s bind q bind ^q
bind f bind ^f
defflow off flow off
bind P paste
shelltitle "$ |bash"
vbell off
term screen-256color
deflog on logfile .screen-logs/%Y%m%d.%S.%n.log logtstamp on logtstamp string "\n-- SCREEN [%Y/%m/%d %02c:%s] %n:%t --\n"
prog2: main.o sub.o gcc -o prog2 main.o sub.o main.o: main.c sub.h gcc -c -o main.o main.c sub.o: sub.c sub.h gcc -c -o sub.o sub.cこれを自動変数を使うと次のように記述することができます。$@や$^のように$から始まる単語が自動変数です。 それぞれの意味を下の表に示します。
prog2: main.o sub.o gcc -o $@ $^ main.o: main.c sub.h gcc -c -o $@ $< sub.o: sub.c sub.h gcc -c -o $@ $<
自動変数 | 説明 |
---|---|
$@ | ターゲット(入力)ファイル(コロンの左側) |
$^ | すべての依存(出力)ファイル(コロンの右側のファイル全て) |
$< | 最初の依存ファイル(コロンの右側の最初のファイル) |
$ make gcc -c -o main.o main.c gcc -c -o sub.o sub.c gcc -o prog2 main.o sub.o
prog2: main.o sub.o
gcc -o $@ $^
%.o: %.c
gcc -c -o $@ $<
main.o: main.c sub.h
sub.o: sub.c sub.h
青字で示した%.o: %.cという行があります。これは、*.cから*.oを作るルールという意味です。 そのコマンドとして、gccを使ったコンパイル処理が記述されています。ここでの$@や$<は 実際のファイルに置換されるため、自動変数を使うとファイル名だけ異なる類似の処理をひとつのコマンドとして記載できます。
また、main.oとsub.oのルールにはコマンドがありません。具体的なコマンドはパターンルールで定義してあるため、 ここでは入出力(依存)関係のみを記述すればよくなります。
本記事では、自動変数とパターンルールについて説明しました。
以下には、make入門の全記事がリストアップされています。
CONFIG | 説明 |
---|---|
BRIDGE | ブリッジ機能 |
SQUASHFS | squashfsサポート |
SQUASHFS_XATTR | squashfsでのxattrのサポート |
OVERLAY_FS | オーバイレイFSのサポート。Dockerなどで使用されている。 |
FUSE_FS | FUSE FSのサポート |
$ cat .config | grep CONFIG_BRIDGE # CONFIG_BRIDGE is not set有効化するには以下を実行します。
scripts/config --enable BRIDGE再度.configを確認すると有効化されています。
$ cat .config | grep CONFIG_BRIDGE CONFIG_BRIDGE=yまた、この変更に伴って新たに設定可能になったCONFIGを以下で確認できます。
$ make listnewconfig CONFIG_BRIDGE_NF_EBTABLES=n CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_MRP=n CONFIG_BRIDGE_CFM=nこれらについて個別に設定しても良いですし、以下のようにするとデフォルトに設定できます。
make olddefconfig
ファイル名 | 説明 |
---|---|
main.c | メインのソースコード |
sub.c | ユーザ定義関数を含むソースコード |
sub.h | ユーザ定義関数のヘッダファイル |
*.o | *.cファイルをコンパイルして生成したオブジェクトファイル |
prog2 | 2つのオブジェクトファイルをリンクして作成される実行ファイル |
prog2: main.o sub.o gcc -o prog2 main.o sub.o main.o: main.c sub.h gcc -c -o main.o main.c sub.o: sub.c sub.h gcc -c -o sub.o sub.c各ソースコードについては、末尾に掲載します。
Makefileの中でprog2の作成ルールが最も先頭に記載されています。例えば、main.oの作成ルールを先頭にすることはできません。 なぜなら、Makefileは、複数のルールが記述されていた場合、先頭のルールで記述された出力ファイルを作成しようとするからです。 つまり、main.oの作成ルールが先頭にあると、makeを実行してもmain.oが作成されて動作が完了します。
prog2の入力ファイルとしてmain.oとsub.oが記述されています。 初めてmakeを実行する場合、これらのファイルが存在しません。 その場合、makeは、次のようにmain.oとsub.oの作成ルールにしたがって、それらを作成します。
$ make gcc -c -o main.o main.c gcc -c -o sub.o sub.c gcc -o prog2 main.o sub.o
touch sub.cmakeを実行するとsub.oが再作成され、それに依存しているprog2も再作成されました。 main.oについては、その入力ファイルであるmain.cが更新されていないため、なにも処理が行われませんでした。 このように依存関係にしたがって、必要な処理のみを実行することがmakeの利点です。
$ make gcc -c -o sub.o sub.c gcc -o prog2 main.o sub.o
$ touch sub.h $ make gcc -c -o main.o main.c gcc -c -o sub.o sub.c gcc -o prog2 main.o sub.o
#include <stdio.h> #include "sub.h" int main() { printf("Calculated result: %d\n", calc(1, 3)); return 0; }
int calc(int a, int b);
int calc(int a, int b) { return a * 2 + b - 1; }
本記事では、複数のルールをMakefileに記述する方法について説明しました。 次回は、自動変数と拡張子ルールという機能を説明します。
以下には、make入門の全記事がリストアップされています。
wget https://releases.ubuntu.com/22.04.2/ubuntu-22.04.2-live-server-amd64.iso
mkdir mnt sudo mount -o ro ubuntu-22.04.2-live-server-amd64.iso mntまた、インストール終了後、以下のようにアマウントします。
sudo umount mnt
qemu-img create -f raw drive1.img 10G参考: QEMU用の仮想ドライブイメージファイルの作成例
#!/bin/sh QEMU=qemu-system-x86_64 CD_IMAGE=ubuntu-22.04.2-live-server-amd64.iso DISK_IMAGE=drive1.img MEMORY=2048 ${QEMU} \ -cpu host \ -enable-kvm \ -m ${MEMORY} \ -drive format=raw,file=${DISK_IMAGE},if=virtio \ -cdrom ${CD_IMAGE} \ -nographic \ -kernel mnt/casper/vmlinuz \ -append console=ttyS0 \ -initrd mnt/casper/initrd起動すると、以下のようなインストーラの画面が表示されます。
================================================================================ Serial [ Help ] ================================================================================ As the installer is running on a serial console, it has started in basic mode, using only the ASCII character set and black and white colours. If you are connecting from a terminal emulator such as gnome-terminal that supports unicode and rich colours you can switch to "rich mode" which uses unicode, colours and supports many languages. You can also connect to the installer over the network via SSH, which will allow use of rich mode. [ Continue in rich mode > ] [ Continue in basic mode > ] [ View SSH instructions ]あとは、キーボードで項目を選択したり、ユーザ名を入力するなどGUIのインストーラと同じように操作します。 以下は、インストール完了時に画面です。
================================================================================ Install complete! [ Help ] ================================================================================ ┌──────────────────────────────────────────────────────────────────────────┐ │ writing etc/fstab ^│ │ configuring multipath │ │ updating packages on target system │ │ configuring pollinate user-agent on target │ │ updating initramfs configuration │ │ configuring target system bootloader │ │ installing grub to target devices │ │final system configuration │ │ configuring cloud-init │ │ calculating extra packages to install │ │ downloading and installing security updates │ │ curtin command in-target │ │ restoring apt configuration │ │ curtin command in-target ││ │subiquity/Late/run v│ └──────────────────────────────────────────────────────────────────────────┘ [ View full log ] [ Reboot Now ]上記でReboot Nowを選択すると、仮想マシンの再起動後に再度インストーラが起動します。そのためCtrl-a xで、QEMUを一旦終了します。
#!/bin/sh QEMU=qemu-system-x86_64 DISK_IMAGE=drive1.img MEMORY=2048 ${QEMU} \ -cpu host \ -enable-kvm \ -m ${MEMORY} \ -drive format=raw,file=${DISK_IMAGE},if=virtio \ -nographic
ssh-keygen -N '' -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
-netdev user,id=NETDEV_ID \ -device virtio-net-pci,netdev=NETDEV_IDあるいは単純に以下のようにしてもよい。
-nic user,model=virtio-net-pci
-netdev user,id=NETDEV_ID,hostfwd=tcp::5522-:22 \
-device virtio-net-pci,netdev=NETDEV_ID
-nicを用いる記述でもポート転送を指定できます。以下の例ではさらに、複数のポートを転送する例を記載します。
-nic user,model=virtio-net-pci,hostfwd=tcp::5522-:22,hostfwd=tcp::5580-:80
-netdev tap,id=NETDEV_ID \
-device virtio-net-pci,mac=02:12:34:56:78:9a,netdev=NETDEV_ID
ブリッジに関しても-nicオプションでより簡潔に記載することが可能。
-nic tap,model=virtio-net-pci,mac=02:12:34:56:78:9a
-nic none
$ qemu-img create -f qcow2 drive.img 10G Formatting 'drive.img', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10737418240 lazy_refcounts=off refcount_bits=16lsに-sオプションを指定してファイルサイズを見てみる。一番左端の196KiBは、そのファイルのストレージ上に占めるサイズ。 所有者foo fooの右側の193KiBは、そのファイルのサイズ。 両者は、ほぼ同じ(これが一般的)。上記コマンドで10GiBのドライブイメージファイルを作成したが、実際のファイルサイズは初期状態では非常に小さい。
$ ls -lhs drive.img 196K -rw-r--r-- 1 foo foor 193K Mar 23 20:30 drive.img
$ qemu-img create -f raw drive.img 10G Formatting 'drive.img', fmt=raw size=10737418240QCOW2の場合と同様にlsでファイルサイズを調べると、上記コマンドで指定したとおり10GiBである。しかし、一番左端の実サイズは非常に小さい。実はRAW形式も、Linuxの多くのファイルシステム(例えばext4)では、スパースファイルと呼ばれる状態のファイルとして作成される。利用に応じて実サイズが増加する。
$ ls -lhs drive.img 4.0K -rw-r--r-- 1 foo foo 10G Mar 23 20:31 drive.img
-drive id=DRIVE_ID,format=qcow2,file=FILE_NAME.qcow2,if=virtio
-drive id=DRIVE_ID,format=raw,file=FILE_NAME.img,if=virtio
-device virtio-scsi-pci次いでドライブを作成
-drive id=DRIVE_ID,format=qcow2,file=FILE_NAME.qcow2,if=none \ -device scsi-hd,drive=DRIVE_ID
-device nec-usb-xhci,id=xhci次いでドライブを作成。
-drive id=DRIVE_ID,format=raw,file=FILE_NAME.raw,if=none \ -device usb-storage,bus=xhci.0,drive=DRIVE_ID
$ tar tf archive.tar.gz dir1/ dir1/b.dat dir1/a.txt
mkdir -p flower/sun tar xf archive.tar.gz -C flower/sun
$ find flower -type f flower/sun/dir1/b.dat flower/sun/dir1/a.txt
Linuxにはmakeというコマンドがあります。もともとはC言語などで作られたプログラムをコンパイルやリンクするために開発されました。そして、今もその用途が中心です。 大規模なプログラムでは、ソースコードファイルが数千や数万以上になります。いくつかのソースコードファイルを変更するたびに、全てをコンパイルしなおすと膨大な時間がかかります。そのため、makeは、変更があったソースコードのみを抽出してコンパイルする手段を提供します。
では、どうやって変更があったソースコードを検出しているのでしょうか?実は、その仕組みはとても単純です。ソースコードのタイムスタンプ(変更日時)とそれをコンパイルして生成されるバイナリファイルのタイムスタンプを比較するだけです。このため、何かのファイルから別のファイルを生成するような用途には、プログラムに限らずに利用できます。例えば、数値データのCSVファイルからグラフファイルを作成するような場合です。
出力ファイル: 入力ファイル
[TAB]処理方法
また、出力ファイルと入力ファイルは、より抽象的に、それぞれ、ターゲットと依存ファイルと呼ばれることもあります。
#include <stdio.h> int main() { printf("Happiness depends upon ourselves.\n"); return 0; }コマンドラインからビルドするには以下のように入力します。
gcc -o prog prog.cつまり、先に述べた3つの情報は次のようになります。
prog: prog.c gcc -o prog prog.cMakefileがあるディレクトリでmakeと入力すると以下のようにコンパイルが実行され、progが作成されていることが分かります。 また、makeの副次的な利点として、gccのコマンドラインオプションすべてを入力しなくても良い点があります。
$ make gcc -o prog prog.c
$ ls -l total 28 -rw-r--r-- 1 foo foo 33 Mar 21 09:01 Makefile -rwxr-xr-x 1 foo foo 16608 Mar 21 10:44 prog -rw-r--r-- 1 foo foo 100 Mar 21 09:01 prog.c
$ make make: 'prog' is up to date.冒頭で説明したように、出力ファイルのタイムスタンプが、入力ファイルのタイムスタンプより新しいため、makeは何も処理を実行しなかったのです。ここで、以下のようにtouchコマンドを実行して、入力ファイルのタイムスタンプを更新します。
$ touch prog.c $ ls -l total 28 -rw-r--r-- 1 kyamato kyamato 33 Mar 21 09:01 Makefile -rwxr-xr-x 1 kyamato kyamato 16608 Mar 21 10:44 prog -rw-r--r-- 1 kyamato kyamato 100 Mar 21 11:01 prog.cこの状態でmakeを実行すると、コンパイルが行われます。
$ make gcc -o prog prog.c
本記事では、make概要とMakefileの基本的な記述方法について説明しました。次回は、Makefileに複数のルールを記載する方法を説明します。
以下には、make入門の全記事がリストアップされています。
Linuxでは、すべてのものはファイルとして扱われます。例えば、キーボード入力や画面出力もファイルとして扱われます。 具体的に見ていきましょう。まず以下のように入力してみます。この出力にはいろいろな知見が含まれます。順に説明します。
# ls -l /proc/self/fd total 0 lrwx------ 1 root root 64 Mar 19 19:26 0 -> /dev/pts/1 lrwx------ 1 root root 64 Mar 19 19:26 1 -> /dev/pts/1 lrwx------ 1 root root 64 Mar 19 19:26 2 -> /dev/pts/1 lr-x------ 1 root root 64 Mar 19 19:26 3 -> /proc/147982/fd
ls -l /proc/self/fd > output.txt
作成されたファイルoutput.txtの内容(すなわち、lsがオープンしているファイル)は次のとおりです。
total 0 lrwx------ 1 root root 64 Mar 21 08:20 0 -> /dev/pts/1 l-wx------ 1 root root 64 Mar 21 08:20 1 -> /root/output.txt lrwx------ 1 root root 64 Mar 21 08:20 2 -> /dev/pts/1 lr-x------ 1 root root 64 Mar 21 08:20 3 -> /proc/160788/fdつまり、コマンドライン上で>を使ってファイルへ保存するとき、lsコマンドの標準出力はリダイレクトされたファイルに なっていることが分かります。以下のその様子を図示します。
ls -l /proc/self/fd > output.txt 2> error.txt
output.txtの内容を確認すると以下のようになっています。
total 0 lrwx------ 1 root root 64 Mar 21 01:00 0 -> /dev/pts/5 l-wx------ 1 root root 64 Mar 21 01:00 1 -> /root/output.txt l-wx------ 1 root root 64 Mar 21 01:00 2 -> /root/error.txt lr-x------ 1 root root 64 Mar 21 01:00 3 -> /proc/75664/fd以下にこの状態を図示します。
ls -l /proc/self/fd > output.txt 2&>1
output.txtの内容は次のとおりです。
total 0 lrwx------ 1 root root 64 Mar 21 02:33 0 -> /dev/pts/1 l-wx------ 1 root root 64 Mar 21 02:33 1 -> /root/output.txt l-wx------ 1 root root 64 Mar 21 02:33 2 -> /root/output.txt lr-x------ 1 root root 64 Mar 21 02:33 3 -> /proc/75694/fdこの状態を図示すると以下のようになります。
less a.txtこの場合、4番に引数で指定したa.txtが割り当てられています。標準入力は端末のままです。 lessは、標準入出力とは別に引数で与えられたファイルをオープンしたということになります。 なお、このlessのPIDの調べ方は、次節の「パイプでプロセス間の入出力を連結する場合」で説明します。
total 0 lrwx------ 1 root root 64 Mar 21 03:11 0 -> /dev/pts/1 lrwx------ 1 root root 64 Mar 21 03:11 1 -> /dev/pts/1 lrwx------ 1 root root 64 Mar 21 03:11 2 -> /dev/pts/1 lr-x------ 1 root root 64 Mar 21 03:11 3 -> /dev/tty lr-x------ 1 root root 64 Mar 21 03:11 4 -> /root/a.txtこの状態を図示すると以下のようになります。
less < a.txt
答えは次のとおり、標準入力は<の右側に指定したファイルになっています。
この違いについては、この記事の最後の「標準入出力は誰が設定するのか?」で詳しく説明します。
total 0 lr-x------ 1 root root 64 Mar 21 04:29 0 -> /root/a.txt lrwx------ 1 root root 64 Mar 21 04:29 1 -> /dev/pts/6 lrwx------ 1 root root 64 Mar 21 04:29 2 -> /dev/pts/6 lr-x------ 1 root root 64 Mar 21 04:29 3 -> /dev/ttyまた、これまで同じく図も示します。
cat a.txt | grep abc
この場合の標準入出力を見てみます。 ただし、上記のコマンドは一瞬で終了するため、実行中の/proc/[PID]/fdを調べることができません。 そのため、少しコマンドを工夫しますが、その前にcatやgrepを実行するbashのPID(プロセスID)を調べておきます。
変数$$には、実行中のbashのPIDが格納されています。以下のとおり、操作しているbashの74570であり、そのbashから実行されたコマンドの親PIDは、74570になります。
$ echo $$ 74570次いで以下のコマンドを実行します。catに引数がありません。 この場合、catは標準入力すなわちキーボードから入力を待っている状態になり、ファイルを読み込んだ時のように瞬時には終了しなくなります。
cat | grep abcここでcatとgrepのPID(プロセスID)を調べます。同じPCの別の端末で、先ほど調べたbashのPIDを親にもつプロセスを探します。
$ ps --ppid 74570 TIME CMD 75104 pts/6 00:00:00 cat 75110 pts/6 00:00:00 grepcatとgrepのPIDはそれぞれ75104と75110であることが分かりました。 それぞれについて、/proc/[PID]/fd以下のファイルを見ます。
$ ls -l /proc/75104/fd total 0 lrwx------ 1 root root 64 Mar 20 09:01 0 -> /dev/pts/1 l-wx------ 1 root root 64 Mar 20 09:01 1 -> 'pipe:[936222]' lrwx------ 1 root root 64 Mar 20 09:01 2 -> /dev/pts/1 $ ls -l /proc/75110/fd total 0 lr-x------ 1 root root 64 Mar 20 09:01 0 -> 'pipe:[936222]' lrwx------ 1 root root 64 Mar 20 09:01 1 -> /dev/pts/1 lrwx------ 1 root root 64 Mar 20 09:01 2 -> /dev/pts/1上記の結果から、catの標準出力がpipe:[936222]というのになっており、grepの標準入力も同じくpipe:[936222]になっています。 これは、下図のようにcatがパイプというファイルに出力を書き込み、grepは同じパイプというファイルからデータを読み出していることを意味します。 また、catの標準入力や標準エラー出力、grepの標準出力と標準エラー出力は、端末である/dev/pts/1となっています。つまり、catは端末を通じてキーボードからデータを入力し、grepが標準出力に書き込んだデータは、端末に表示されることが分かります。
$ ls -F /proc/ 1/ 73669/ crypto irq/ modules sys/ 3674/ 73681/ devices kallsyms mounts@ sysrq-trigger 3675/ 73687/ diskstats kcore mtrr sysvipc/ 38/ 91/ dma keys net@ thread-self@ 4771/ 92/ driver/ key-users pagetypeinfo timer_list 4777/ acpi/ dynamic_debug/ kmsg partitions tty/ 4778/ asound/ execdomains kpagecgroup pressure/ uptime 61/ buddyinfo fb kpagecount schedstat version 72/ bus/ filesystems kpageflags self@ vmallocinfo 73/ cgroups fs/ loadavg slabinfo vmstat 73632/ cmdline interrupts locks softirqs zoneinfo 73638/ consoles iomem meminfo stat 73639/ cpuinfo ioports misc swaps一見して分かるように、数字だけのディレクトリ(例: 1/, 3674/など)と、それ以外のファイルやディレクトリ(例: acpi/, buddyinfoなど)があります。 数字のディレクトリは、その値のプロセス番号をもつプロセスの情報をそのディレクトリ以下にファイルとして持ちます。 それ以外のファイルやディレクトリ(以下のファイル)には、システム全体の情報が格納されています。
$ sleep 3600 & [1] 73717このプロセスに関する/procの情報を見てみましょう。
$ ls -F /proc/73717/ arch_status fd/ net/ setgroups attr/ fdinfo/ ns/ smaps autogroup gid_map numa_maps smaps_rollup auxv io oom_adj stack cgroup ksm_merging_pages oom_score stat clear_refs ksm_stat oom_score_adj statm cmdline limits pagemap status comm loginuid patch_state syscall coredump_filter map_files/ personality task/ cpu_resctrl_groups maps projid_map timens_offsets cpuset mem root@ timers cwd@ mountinfo sched timerslack_ns environ mounts schedstat uid_map exe@ mountstats sessionid wchanいろんなファイルやディレクトリがありますが、筆者がよく参照するものを2つここではあげます。
$ ls -l /proc/73717/exe lrwxrwxrwx 1 foo foo 0 Mar 19 11:06 /proc/73717/exe -> /usr/bin/sleep
$ ls -l /proc/73717/fd total 0 lrwx------ 1 foo foo 64 Mar 19 11:15 0 -> /dev/pts/5 lrwx------ 1 foo foo 64 Mar 19 11:15 1 -> /dev/pts/5 lrwx------ 1 foo foo 64 Mar 19 11:15 2 -> /dev/pts/5
$ cat /proc/partitions major minor #blocks name 259 0 1953514584 nvme0n1 259 1 498688 nvme0n1p1 259 2 19530752 nvme0n1p2 259 3 19530752 nvme0n1p3 259 4 19530752 nvme0n1p4 259 5 19530752 nvme0n1p5 259 6 1874891776 nvme0n1p6
$ uptime 11:22:23 up 9:19, 2 users, load average: 0.00, 0.00, 0.00
あるプロセスがこのファイルを参照する時、それは、そのプロセス用ディレクトリへのリンクになっています。つまり、読み出すプロセスによって異なるリンク先を示します。
以下の例では、リンク先になっている73729は、/procを読み出しているlsコマンド自身のプロセスIDを持つディレクトリです。
$ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 19 02:02 /proc/self -> 73729
sudo apt install gcc make flex bison bc libncurses-dev libelf-dev libssl-dev
以下のサイトにカーネルのソースコードが掲載されています。
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.7.tar.xz
tar xf linux-6.2.7.tar.xz
cd linux-6.2.7 make defconfig
make menuconfig上記のように入力すると、次のTUIベースの設定画面が表示されます。これを使って必要なCONFIGを追加/削除できます。
scripts/config -e CONFIG_DEBUG_INFO_DWARF5その後、設定されていないシンボルをデフォルトにする
make olddefconfig
make -j32
上記の-j32は、32並列でのコンパイルを行うオプション。実際のCPU数に合わせて適宜変更。
次のメッセージが表示されればビルド成功。下記のbzImageは、多くのLinux OSでvmlinuz-6.1.0-5-amd64のような名前になっているものと同じです。
Kernel: arch/x86/boot/bzImage is ready (#1)
wget https://cloud.debian.org/images/cloud/bullseye/20230124-1270/debian-11-nocloud-amd64-20230124-1270.qcow2
次のとおりQEMUを実行します。--nographicオプションを付与しているので、仮想マシンにシリアルデバイスが作成されます。 また、カーネルオプションにconsole=ttyS0を付与して、コンソールをシリアルデバイスに設定しています。 これらによりQEMUを実行している端末が、そのままシリアルデバイスへの入出力端末となります。
なお、defconfigで設定した場合、virtio経由のストレージ機能がカーネルに組み込まれます。 initrdなしで直接rootfsをカーネルがマウントできます。
sudo qemu-system-x86_64 \ -cpu host \ --enable-kvm \ -m 1024 \ -nographic \ -drive id=drive0,format=qcow2,file=debian-11-nocloud-amd64-20230124-1270.qcow2,if=virtio \ -kernel arch/x86_64/boot/bzImage \ -append "root=/dev/vda1 console=ttyS0"以下のようなログインプロンプトが表示されれば成功です。
(省略) Debian GNU/Linux 11 debian ttyS0 debian login:このイメージでは、ユーザ名としてrootと入力すると、パスワードなしで以下のようにログインできます。
Linux debian 6.2.7 #1 SMP PREEMPT_DYNAMIC Sun Mar 19 02:39:21 UTC 2023 x86_64 (省略) root@debian:~#
(Ctrl-a, cを入力) QEMU 7.2.0 monitor - type 'help' for more information (qemu) q
/etc/network/interfaces
の内容。ここでは、ブリッジbr0に物理NICenp6s0
を含む。
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug enp6s0 iface enp6s0 inet manual auto br0 iface br0 inet static bridge_ports enp6s0 address 192.168.10.10 netmask 255.255.255.0 gateway 192.168.10.1 dns-nameservers 192.168.10.1 bridge_stp off bridge_maxwait 0
種別 | 説明 |
---|---|
us | ユーザモードでのプログラム実行時間。プログラムの通常処理の時間 |
sy | カーネルモードでのプログラム実行時間。プログラムがシステムコールを呼び出すことにより、カーネル内のコードが実行された時間。ファイルの読み書きや、ネットワーク処理などがこれに相当 |
ni | 正のNICE値が設定され、低優先度となっているプロセスのプログラム実行時間 |
id | アイドル時間。何も実行していない時間 |
wa | ストレージなどのデバイスへの入出力処理で、デバイスから応答を待っている時間 |
hi | ハードウェア割り込み処理の実行時間 |
si | ソフトウェア割り込み処理の実行時間 |
st | ハイパーバイザ型仮想マシン上の仮想CPUが、物理CPUの割り当てを待っている時間 |
分類 | 項目 | 説明 |
---|---|---|
Mem | total | 全メモリ容量 |
free | 空きメモリ容量 | |
used | 使用中のメモリ容量 | |
buff/cache | ディレクトリエントリやファイル内容のキャッシュ容量。Linuxは、空きメモリを積極的にこれらのキャッシュに割り当てるため、使用するに従い空きメモリが減少し、これらの値が増加する傾向にある | |
Swap | total | 全スワップ容量 |
free | 空きスワップ容量 | |
used | 使用中のスワップ容量 | |
avail Mem | 利用可能なメモリ容量。大雑把には空きメモリ容量とキャッシュの合計 |
項目 | 説明 |
---|---|
PID | プロセスID |
USER | そのプロセスの実行ユーザー |
PR | プロセスの実行優先度。20が標準。数値が小さいほど優先度が高い |
NI | NICE値。この値が正なら、その値に応じて低優先度で実行される。負ならその値に応じて高優先度で実行される |
VIRT | 仮想メモリ使用量。プロセスが確保したメモリ量。この値の一部にしか物理メモリが割り当てられていない。この値が大きくてもそれほどメモリを使っていない場合もある。 |
RES | 物理メモリ使用量。プロセスに割り当てられた物理メモリ量。そのプロセスの実際のメモリ使用量。 |
SHR | 共有メモリ使用量。RESのうち、他のプロセスと共有されているメモリ量。 |
S | プロセスの状態: R (実行中)、S (スリープ)、D(割り込み不可のスリープ)、Z(ゾンビ状態) |
%CPU | CPU使用率。ひとつのCPUをフルに使った場合100%となる。複数のCPUを使っている場合、100%を超えることがある |
%MEM | メモリ使用率 |
TIME+ | プロセスのCPU使用時間。起動してからの時間ではなく、CPUが割り当てられた(つまりそのプロセスのプログラムが実行された)時間の合計。1/100秒単位。 例: 1:23.45の場合、1分23秒450ミリ秒 |
COMMAND | 実行コマンド |
以下の記事は、Ubuntu 20.04上で下図の構成での実行記録。
git clone https://github.com/novnc/noVNC.git
sudo apt install python3-websockify
websockify --web=noVNC 8081 192.168.1.20:5901
以下のURLへWebブラウザでアクセス
deb http://deb.debian.org/debian/ bookworm contrib non-free non-free-firmware
デフォルトでは、ホストOS上にストレージプール用のループバックマウント用のファイルを作成する。作成時点でそのサイズを決める(例えば100GiB)。
このストレージプール用のファイルは、シンプロビジョニングされるので、最初のサイズは0。使った分だけ増えていく。ただし、コンテナを削除したり、コンテナ内のファイルを削除しても、ストレージプールの容量は減少しない。これがパーソナルユースでは、ストレスになる。ストレージプール用のファイルを拡張できるものの、最初に最大サイズをいくらにするかを決めるのは、なかなか悩みどころである。
ストレージプールのループバックファイル上btrfsなどのパーティションを作れば、スナップショットやコンテナのコピーを高速に取得できるなどのメリットもある。しかし、私の使い方では、動作中にスナップショットをとるような用途もほとんどない。コンテナそのものは、それほど肥大化しないので、コピーすることがあっても、少し待てば終わる。そのため、これらのメリットをほぼ享受できない。
また、LXCでも同様のことは可能である。自前でループバックマウント用ファイルを作ってbtrfsでフォーマットし、rootfsをその上に設定すればよい。
/usr/bin/sshd -d -p 8022 -o "PermitRootLogin yes"
ssh -p 8022 -lroot サーバのIPアドレス
auto enp6s0
iface enp6s0 inet static
bridge_ports enp6s0
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.254
参考: https://wiki.debian.org/NetworkConfiguration
Category | Name |
---|---|
Window Manager | OpenBOX |
Task Bar | Tint2 |
Terminal | RXVT unicode |
Filer | PCManFM |
Music Player | Pragha |