tag:blogger.com,1999:blog-90251257364981156082024-03-13T19:05:11.324+09:00宇宙の晴れ上がりLinux, OSS, Softwareずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.comBlogger440125tag:blogger.com,1999:blog-9025125736498115608.post-92233116722128101382024-02-18T17:03:00.003+09:002024-02-18T18:23:40.357+09:00LXCコンテナの中からKVMを使用する設定ホストOSの<tt>/var/lib/lxc/[CONTAINER NAME]/config</tt>に以下を追加して再起動。(ホストOSがcgroup v1を使っている場合、cgroup2をcgroupに変更する)
<pre>
# /dev/kvm
lxc.cgroup2.devices.allow = c 10:232 rwm
lxc.mount.entry = /dev/kvm dev/kvm none bind,optional,create=file
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-51465900616991201642024-02-17T13:03:00.004+09:002024-02-18T11:47:30.277+09:00USBストレージから起動するテキストベースLinuxイメージ標記のひとつにDebian Liveイメージがある。
<h3>配布サイト</h3>
<div>
<a href="https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/">
https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/</a>
</div>
<br>
上記のサイトには各種Linuxディストリビューションのイメージがある。特に好みがなければ、以下のようなstandard版を使う。
<ul><li>debian-live-12.5.0-amd64-standard.iso</li></ul>
<h3>USBストレージへの書き込み</h3>
以下の例では、青色の/dev/sdxがUSBストレージのデバイス。/proc/partitionsやdmsgの出力などから実際に接続しているデバイスを特定してそれに変更する
<pre>
dd if=debian-live-12.5.0-amd64-standard.iso of=<font color="blue">/dev/sdx</font> bs=1M
</pre>
上記の<tt>bs=1M</tt>は、ブロックサイズを1MiBにするオプション。昔、特定の環境でブロックサイズを一定サイズ以上に設定しないと極端に遅いことがあったので習慣として付与している。最近のほとんどのLinux環境では、なくても問題ないと思われる。
<h3>おまけ:QEMUの実行例</h3>
<pre>
#!/bin/sh
QEMU=qemu-system-x86_64
IMAGE=debian-live-12.5.0-amd64-standard.iso
MEMORY=2048
${QEMU} \
-cpu host \
-enable-kvm \
-m ${MEMORY} \
-device nec-usb-xhci,id=xhci \
-drive id=DRIVE_ID,format=raw,file=${IMAGE},if=none \
-device usb-storage,bus=xhci.0,drive=DRIVE_ID
</pre>
上記スクリプトを実行する次のような画面が表示される。
<div>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpu70V8sKGoG9vjKVCEyWyiGq-CZteyGVby4FonWLqLB5ynQ4Z9pZGmXZhFOzhl55RYh03IOX4U9s1tGPJdXopD7dC6LIP4VKiScwCtmIagnmYIq_laGqf7TLKmbHzCK8_dto_0Atib-W2hIi-rQgbj1RHvBh8SLej1Ok_mTkqnEqag6LyF_Vuxhf5Bg/s1600/debin12-live.png"/>
</div>
上の画面で<tt>Live system (amd64)</tt>を選択する(ENTERキーを押す)と、次のようにコンソール画面が表示される。
<div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMM13Wst74g5S1PjdntozZm6wR5tsQJQiXfuMm42yg8pMCOOY3QoWaFsRyXS2QPMI-zk3_DRaa0A1Vj_ptPILcR65X0o3EWALrj-Eu37qkv6I8d2bT0nR_9HRrIQlmNXAYXT1l-Ktej17zGFVPccVUZx4ZFYryeadhs-zeUniHJzVL5UOgdbF0jzVT8w/s1600/console.png"/></a></div>
<h4>参考</h4>
<a href="https://transparent-to-radiation.blogspot.com/2023/03/qemu.html">QEMUでドライブを追加するオプション例</a>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-44460601907252549122024-02-17T12:59:00.001+09:002024-02-17T12:59:07.495+09:00X11でのWindowsのスクリーンショットの撮り方<h3>対象WindowのIDを取得</h3>
xwininfoを使用
<h3>wxdコマンド実行</h3>
下記では青字部分がWindow ID。適宜変更。
<pre>
wxd -id <font color="blue">0x1000011</font> | convert xwd:- screenshot.png
</pre>
上記のパイプの右側は、ImageMagickを使って画像をpngに変換する。ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-54028136462012857512024-01-19T09:48:00.003+09:002024-01-19T09:48:24.409+09:00Linuxのコンソールのディスプレイをオフするkernelのコマンドラインに<tt>consoleblank=[N]</tt> (Nはオフまでの秒数)を追加する。
<p>
DebianやUbuntuでは、<tt>/etc/default/grub</tt>の<tt>GRUB_CMDLINE_LINUX_DEFAULT</tt>に以下のようにconsoleblankオプションを追加する。
<pre>
GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=60"
</pre>
その後、grub.confを更新して再起動する。
<pre>
update-grub2
reboot
</pre>
</p>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-8484582601417807772024-01-14T14:14:00.005+09:002024-02-02T11:17:54.204+09:00VIMでWindowの幅を設定する例<pre>
:vert resize 80
</pre>
もちろん、複数のwindowが縦に分割されてないと意味がないずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-52088331845762364172024-01-14T09:58:00.005+09:002024-01-14T10:05:54.029+09:00LXCコンテナにログインできない、または、時間がかかる時の対処ホストOSのログに次のメッセージがある場合、AppArmorによってコンテナ内の動作 (この場合mount) がブロックされている。
このログは、ホストOSがUbuntu 20.04、コンテナがDebian 12のケース。
<pre class="wrap">
kernel: audit: type=1400 audit(1705193372.029:49): apparmor="DENIED" operation="mount" info="failed perms check" error=-13 profile="lxc-sakura_</var/lib/lxc>" name="/run/systemd/unit-root/" pid=4456 comm="(d-logind)" srcname="/" flags="rw, rbind"
</pre>
ホストOSの<tt>/var/lib/lxc/[Container名]/config</tt>に次の2行を加えて、LXCコンテナを起動
<pre>
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
</pre>
<h3>参考</h3>
<a href="https://transparent-to-radiation.blogspot.com/2023/05/lxcdocker.html">LXCコンテナの中でDockerを使用するための設定</a>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-57943545906958213992023-12-17T10:34:00.000+09:002023-12-17T10:34:07.584+09:00gradleでのテスト関係のオプション例<h3>ビルドのみ(テストしない)</h3>
<pre>
./gradlew build -x test
</pre>
<h3>指定のテストを実行</h3>
<pre>
./gradlew test --tests "SomeTest.*"
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-34734858057153327842023-11-12T08:34:00.003+09:002023-11-12T08:34:37.755+09:00gitで特定の行範囲の変更を追跡する<tt>-L開始行,終了行:ファイル名</tt>オプションを使えばよい
例
<pre>
git log -L 4,11:.screenrc
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-28164048117991777022023-09-10T10:47:00.003+09:002023-09-10T10:47:18.126+09:00シリアルコンソールで、ターミナルサイズを変更する方法シリアルコンソールを使うとデフォルトでは、ターミナルサイズが80x25になっていることが多い。
<pre>
# stty size
25 80
</pre>
これを実際の仮想端末のサイズにフィットするには以下のコマンドを実行する
<pre>
# setterm --resize
</pre>
すると、ターミナルサイズが変更される
<pre>
# stty size
51 204
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-60568063235513755222023-09-09T21:04:00.002+09:002023-09-10T08:21:16.608+09:00Ubuntu上で新しいバージョンのDebianのLXCコンテナを作る方法例えば、Ubuntu 20.04上でDebian12のLXCコンテナを作成すると、'signed by unknown key'(知らない鍵で署名されている)と表示されエラーとなる。
<pre># 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) <ftpmaster debian.org="">" 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
</ftpmaster></pre>
次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。
<pre>wget https://ftp-master.debian.org/keys/<span style="color: #2b00fe;">archive-key-12.asc</span> -O - --quiet \
| gpg --import --no-default-keyring --keyring=/usr/share/keyrings/debian-archive-keyring.gpg
</pre><span style="color: #2b00fe;">
青字</span>の部分は使用するDebianのバージョンに適宜変更する。鍵の一覧は以下のサイトにある。
<a href="https://ftp-master.debian.org/keys.html">https://ftp-master.debian.org/keys.html</a>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-20582196298151930652023-07-16T18:58:00.002+09:002023-07-16T19:07:59.890+09:00Xvfbにxrandrで解像度を追加する追加したい解像度を引数にして、cvtコマンドを実行する。
<pre>$ cvt <span style="color: #2b00fe;">1280 800</span>
# 1280x800 59.81 Hz (CVT 1.02MA) hsync: 49.70 kHz; pclk: 83.50 MHz
Modeline "1280x800_60.00" <span style="color: #800180;">83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync</span>
</pre>
上記の出力を引数にxrandr --newmode、--admode、-sを実行する。
<pre>xrandr --newmode <span style="color: #2b00fe;">1280x800</span> <span style="color: #800180;">83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync</span>
xrandr --addmode screen <span style="color: #2b00fe;">1280x800</span>
xrandr -s <span style="color: #2b00fe;">1280x800</span>
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-55406136030814140172023-05-13T21:08:00.006+09:002023-05-14T21:52:57.602+09:00LXCコンテナの中でDockerを使用するための設定/var/lib/lxc/[container名]/configに以下の設定を追加し、コンテナを(再)起動する。
<h3>なるべく安全な方法</h3>
<pre>
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
</pre>
<h3>とにかく権限を与える方法</h3>
上記で駄目な場合、以下ならほとんどのケースで起動可能。上記に<tt>lxc.cap.drop =</tt>を加えて、Dockerを起動できる場合もあり。
<pre>
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-69311875857234842622023-05-06T14:09:00.005+09:002023-05-10T07:05:55.575+09:00Ethernet、UDP、TCPパケットの構造<h2 id="ethernet-pkt">Ethernetパケット</h2>
ヘッダサイズ: 14B (802.1Q VLANタグがある場合18B)、チェックサムサイズ: 4B
<table>
<tr>
<th>サイズ (B)</th><th>説明</th>
</tr><tr>
<td>6</td><td>送信先MAC</td>
</tr><tr>
<td>6</td><td>送信元MAC</td>
</tr><tr>
<td>[4]</td><td>802.1Qタグ (VLANタグ)</td>
</tr><tr>
<td>2</td><td>Ethernet type/size. IPv4:0x0800, IPv6:0x86dd</td>
</tr><tr>
<td>-</td><td>ペイロード(IPなど)</td>
</tr><tr>
<td>4</td><td>FCS (Frame Check Sequence; CRC)</td>
</tr>
</table>
参考: <a href="https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0">Wikipedia: イーサーネットフレーム</a>
<h2>IPv4</h2>
ヘッダサイズ: 20B (拡張情報を除く)
<table>
<tr>
<th>サイズ (B)</th><th>説明</th>
</tr><tr>
<td>1</td><td>バージョン(MSB 4bit)、ヘッダ長(LSB 4bit) 4オクテット単位</td>
</tr><tr>
<td>1</td><td>サービス種別</td>
</tr><tr>
<td>2</td><td>全長(IPヘッダを含む)</td>
</tr><tr>
<td>2</td><td>識別子</td>
</tr><tr>
<td>2</td><td>フラグ(MSB 3bit)、フラグメントオフセット(LSB 13bit)</td>
</tr><tr>
<td>1</td><td>TTL (Time to Live)</td>
</tr><tr>
<td>1</td><td>上位プロトコル. ICMP: 0x01, TCP:0x06, UDP:0x11</td>
</tr><tr>
<td>2</td><td>IPヘッダのチェックサム</td>
</tr><tr>
<td>4</td><td>送信元アドレス</td>
</tr><tr>
<td>4</td><td>送信先アドレス</td>
</tr><tr>
<td>[2]</td><td>拡張情報</td>
</tr><tr>
<td>-</td><td>データ</td>
</tr>
</table>
参考: <a href="https://ja.wikipedia.org/wiki/IPv4">Wikipedia: IPv4</a>
<h2>UDP</h2>
ヘッダサイズ: 8B
<table>
<tr>
<th>サイズ (B)</th><th>説明</th>
</tr><tr>
<td>2</td><td>送信元ポート</td>
</tr><tr>
<td>2</td><td>送信先ポート</td>
</tr><tr>
<td>2</td><td>データ長</td>
</tr><tr>
<td>2</td><td>チェックサム</td>
</tr><tr>
<td>-</td><td>ペイロード(IPなど)</td>
</tr>
</table>
参考: <a href="https://ja.wikipedia.org/wiki/User_Datagram_Protocol">Wikipedia: UDP</a>
<h2>TCP</h2>
ヘッダサイズ: 20B
<table>
<tr>
<th>サイズ (B)</th><th>説明</th>
</tr><tr>
<td>2</td><td>送信元ポート</td>
</tr><tr>
<td>2</td><td>送信先ポート</td>
</tr><tr>
<td>4</td><td>シーケンス番号</td>
</tr><tr>
<td>4</td><td>確認応答番号</td>
</tr>><tr>
<td>2</td><td>ヘッダ長(MSB 4bit)[32bit単位]、予約(3bit)、フラグ(9bit)</td><tr>
</tr><tr>
<td>2</td><td>Windowサイズ</td>
</tr><tr>
<td>2</td><td>チェックサム</td>
</tr><tr>
<td>2</td><td>緊急ポインタ</td>
</tr><tr>
<td>[4-40]</td><td>オプション</td>
</tr><tr>
<td>-</td><td>ペイロード</td>
</tr>
</table>
参考: <a href="https://ja.wikipedia.org/wiki/Transmission_Control_Protocol">Wikipedia: TCP</a>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-41484080291546094362023-05-05T18:08:00.006+09:002023-05-10T07:00:04.673+09:00QEMUでLinuxカーネルをGDBでデバッグする<h2>QEMUの起動</h2>
以下の2つのオプションを使う
<table>
<tr><th>オプション</th><th>説明</th></tr>
<tr><td>-s</td><td>TCP 1234番でGDBのリモートコクションをオープンします</td></tr>
<tr><td>-S</td><td>GDBにアタッチされるまでゲストの実行を待機します。カーネルの起動後にアタッチしても問題ない場合、不要です。</td></tr>
</table>
<h2>Linuxの起動オプション</h2>
QEMUで起動されるLinuxカーネルのコマンドラインオプションに<span style="color: blue;"><tt>nokaslr</tt></span>を付与する。通常、GRUBなどのブートローダーに指定する。このオプションは、カーネルの関数の配置アドレスのランダム化を抑止する。このオプションを指定しない場合、カーネルのデバッグ情報に記載されているアドレスと、実際のアドレスがことなり、GDBの操作が期待どおりに行われない。
<h2>デバッグ情報の入手</h2>
ターゲットのカーネルに対応するデバッグ情報ファイルを取得する。
<h3>Debianの場合の例</h3>
<pre>
sudo apt install linux-image-5.10.0-22-amd64-dbg
</pre>
あるいは、APT repositoryから直接取得する。
<pre>
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
</pre>
<h3>自分でビルドしたカーネルの場合</h3>
カーネルのビルドディレクトリにvmlinuxがあるのでそれを使う。ただし、ビルド時、以下の点に留意
<ul>
<li>以下のCONFIGを有効化</li>
<ul>
<li>CONFIG_DEBUG_INFO_DWARF5、または、CONFIG_DEBUG_INFO_DWARF4</li>
<li>CONFIG_GDB_SCRIPTS</li>
<li>CONFIG_FRAME_POINTER</li>
</ul>
<li>以下のCONFIGを無効化</li>
<ul>
<li>CONFIG_DEBUG_INFO_REDUCED</li>
</ul>
</ul>
参考: <a href="https://docs.kernel.org/dev-tools/gdb-kernel-debugging.html">https://docs.kernel.org/dev-tools/gdb-kernel-debugging.html</a>
<h2>GDBの起動</h2>
デバッグ情報付きのvmlinuxを引数にしてGDBを起動する
<pre>
gdb /usr/lib/debug/vmlinux-5.10.0-22-amd64
</pre>
GDB起動後、以下のコマンドを実行する
<pre>
(gdb) target remote [QEMU起動マシンのアドレス]:1234
</pre>
<h3>グローバル変数の表示例</h3>
<pre>
(gdb) p jiffies
$1 = 4295462764
</pre>
<h3>ブレークポイントの例</h3>
do_sys_openにブレークポイントを仕掛けて、ゲストOSでファイルを開く操作をすると以下のようにブレークする
<pre>
(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
</pre>
<h3>実行中のプロセスのtask_structの表示例</h3>
上記のブレーク例は、lsを実行したときのものである。このときのプロセスが確かにlsであることと、そのプロセスIDを確認する。
<pre>
(gdb) set $curr = (struct task_struct **)($gs_base + (void *)&current_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
</pre>
上記について補足する。実行中のプロセスのtask_struct構造体へのポインタは、CPUごとの変数領域の中にあり、グローバル変数<tt>current_task</tt>の値は、その領域におけるオフセットである。また、CPUごとの変数領域の開始位置はGSセグメントレジスタに格納されている。そのため、両者を加算したアドレス位置に実行中のプロセスに関するtask_struct領域へのポインタが格納されている。
<h2>参考</h2>
<ul>
<li><a href="https://www.qemu.org/docs/master/system/gdb.html">QEMU公式のGDBに関する文書</a></li>
<li><a href="https://transparent-to-radiation.blogspot.com/p/qemu.html">本ブログのQEMUの記事一覧</a></li>
</ul>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-74674489889110019462023-05-04T08:19:00.001+09:002023-05-04T09:16:17.566+09:00ふるさと納税でおおすすめの返礼品: バンバーグ編ハンバーグ大好きな私が、ふるさと納税の返礼品でおすすめのハンバーグを紹介します。一概に優劣はつけにくいが、好きなものから順に紹介する。
<h2>兵庫県淡路市: 淡路島玉ねぎのBIG生ハンバーグ 200g×10個</h2>
玉ねぎ入り。けど玉ねぎが強すぎず、いい意味で肉感が減少して、すこしあっさり目で飽きない。
<div><img width="400rem" src="https://img.furusato-tax.jp/cdn-cgi/image/width=520,height=323/img/x/product/details/20221015/sd1_55df716914b640d1d397bab011ade27d55dfb1fd.jpg"/></div>
<h2>岩手県一関市:《格之進》金格ハンバーグ120g×6個</h2>
やや小ぶりだが、その分、美味しさが凝縮されている。高いレベルでバランスが良い。
<div><img width="400rem" src="https://www.jreastmall.com/img/goods/F179/L/F179-ichinoseki00083.jpg"/></div>
<h2>佐賀県吉野ヶ里町: 佐賀牛入り 黒毛和牛 ハンバーグ 12個 大容量 1.8kg (150g×12個)</h2>
肉感が高く、肉の香り、肉汁が溢れ出している。とにかく肉好きにはおすすめ。
<div><img width="400rem" src="https://www.jreastmall.com/img/goods/F122/L/F122-FBX005.jpg"/></div>
<h2>福岡県新宮町: どーんと3㎏!4種ハンバーグセット【150g×20個】</h2>
レンジでできるのありがたい。
<div><img width="400rem" src="https://www.jreastmall.com/img/goods/F213/L/F213-A643.jpg"/></div>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-33267942506410303352023-05-02T19:59:00.002+09:002023-05-03T08:44:56.162+09:00QEMUでホストのディレクトリをゲストに9pで共有する<h2>ホスト側</h2>
QEMUに起動時に次のオプションを付与する。青字のIDは適宜変更可能。紫のタグについても適宜変更。
<pre>
-fsdev local,path=$(pwd),security_model=mapped-xattr,id=<span style="color: blue;">fsdev1</span> \
-device virtio-9p-pci,fsdev=<span style="color: blue;">fsdev1</span>,mount_tag=<span style="color: #800180;">tag1</span>
</pre>
<h3>参考</h3>
<h4>パラメータの詳細</h4>
<ul><li>
<a href="https://wiki.qemu.org/Documentation/9psetup">Documentation/9psetup</a>
</li></ul>
<h4>QEMU起動の全体のパラメータ</h4>
<ul>
<li>
<a href="https://transparent-to-radiation.blogspot.com/2018/09/qemu.html">QEMUの基本的な使用方法</a>
</li><li>
<a href="https://transparent-to-radiation.blogspot.com/p/qemu.html">QEMUの記事一覧</a>
</li>
</ul>
<h2>ゲスト側</h2>
<tt>tag1</tt>の部分は、QEMU起動時にホスト側で指定した文字列と同じものを指定します。
<pre>mount -t 9p -o trans=virtio <span style="color: #800180;">tag1</span> /mnt/dir_tag1 -oversion=9p2000.L
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-45790194432094131822023-05-02T16:11:00.031+09:002023-05-06T11:34:22.969+09:00プログラミング言語の実行速度比較(2023/5)<h2>はじめに</h2>
先月、<a href="https://transparent-to-radiation.blogspot.com/2023/04/20234.html">プログラミング言語の実行速度比較(2023/4)</a>という記事を投稿した。
思ったより多くの方に見ていただき、有用なコメントやPull Requestをいただいたので、それらを踏まえ以下の更新を行い結果を再投稿する。
<ul>
<li>明示的な型をもつ言語では、それぞれ32bit、64bit長型の変数を使った場合についてそれぞれ測定</li>
<li>C言語については前回の結果で固定長配列とrealloc()を使った場合で大きな違いがなかったのでrealloc()版のみエントリ</li>
<li>C/C++では、実用上ほぼ使用されない最適化なしをドロップ</li>
<li>Go版では、@kaoriyaさんから、数値の型(int)をint32に変えると性能が向上する旨の<a href="https://twitter.com/kaoriya/status/1649342631263207424">コメント</a>を頂いた。Go版もint32とint64で測定した</li>
<li>Scala版では、@windymeltさんから、<a href="https://blog.3qe.us/entry/2023/04/21/041246">GraalVMを使った場合の性能向上について情報</a>を頂いた。JVM上で動作するプログラムについては、実行環境としてGraalVMを使った場合の結果も追加した</li>
<li>PHP版では、<a href="https://github.com/sj-i">sj-i</a>さんからJITを有効にする<a href="https://github.com/kz0817/mylab/pull/2">Pull Request</a>をいただいたのでそれも追加</li>
<li>Ruby版を追加</li>
<li>前回、低消費電力が特徴のIntel Core i7-8559Uで測定を行った。これに加えて、比較的能力の高いIntel Core i9-12900Kでも測定を行った</li>
</ul>
また、当然だがこの投稿で使った素数の算出は様々なワークロードの中のひとつ。実用上、CPUだけぶん回しているタスクはむしろ少数派かも。
<h2>速度比較</h2>
<h3>方法</h3>
<ul>
<li>シングルスレッドで、逐次既知の素数で割ることで素数を100,000,000まで求める(ソースは<a href="https://github.com/kz0817/mylab/tree/3d7af8646d9460db7665a26be99ebf16fc843e24/prime-number">ここ</a>)。いわゆる<a href="https://ja.wikipedia.org/wiki/試し割り法">試し割り法</a></li>
<li>その際の実行時間と最大物理メモリ使用量を計測する</li>
<li>素数の数は5,761,455個なので、数値が32bitの場合、それらを格納するには少なくとも約22MiBのメモリが必要(64bitの場合、約44MiB)</li>
<li>言語の比較なので、なるべくユーザモードで動作するコードとして素数の算出を選んだ。カーネルが関係するのはメモリのアロケーション時が中心だが、実行時間の1%もない</li>
</ul>
<h3>評価環境</h3>
<h4>CPU1 (C1)</h4>
<ul>
<li><a href="https://ark.intel.com/content/www/jp/ja/ark/products/137979/intel-core-i78559u-processor-8m-cache-up-to-4-50-ghz.html">Intel Core i7-8559U</a> (Max 4.5GHz), Cache 8MB, TDP 28W</li>
<li>DDR4 2400MHz 32GiB</li>
</ul>
<h4>CPU2 (C2)</h4>
<ul>
<li><a href="https://www.intel.co.jp/content/www/jp/ja/products/sku/134599/intel-core-i912900k-processor-30m-cache-up-to-5-20-ghz/specifications.html">Intel Core i9-12900K</a> (Max 5.2GHz), Cache 30MB (L2:14MB), MTP 241W</li>
<li>DDR4 3200MHz 64GiB</li>
</ul>
<h4>OS</h4>
<ul>
<li>Debian 12 (sid)</li>
</ul>
<h2>結果</h2>
表の横幅が画面に収まりきらない場合、横スクロールしてご覧ください。
<div class="scroll-box">
<table class="nowrap-20230501-001">
<tbody><tr>
<th rowspan="2">Category</th>
<th rowspan="2">言語</th>
<th rowspan="2">数値型</th>
<th colspan="2">時間 (sec)</th>
<th colspan="2"><span>最大使用</span><br /><span>物理メモリ</span><br />(MiB)</th>
<th rowspan="2"><span>算出素数格納</span><br /><span>コンテナ</span></th>
<th rowspan="2">備考</th>
</tr><tr>
<th>C1</th>
<th>C2</th>
<th>C1</th>
<th>C2</th>
</tr>
<tr>
<td rowspan="8">AOT<br />Compile</td>
<td>C</td>
<td>int</td>
<td>12.6</td>
<td>7.5</td>
<td>23.6</td>
<td>23.6</td>
<td>realloc()</td>
<td>gcc 12.2.0 最適化-O3</td>
</tr>
<tr>
<td>C</td>
<td>long</td>
<td>41.6</td>
<td>12.5</td>
<td>45.5</td>
<td>45.6</td>
<td>realloc()</td>
<td>〃</td>
</tr>
<tr>
<td>C++</td>
<td>int</td>
<td>12.7</td>
<td>7.7</td>
<td>36.5</td>
<td>36.5</td>
<td>std::vector</td>
<td>〃</td>
</tr>
<tr>
<td>C++</td>
<td>long</td>
<td>41.9</td>
<td>12.5</td>
<td>67.6</td>
<td>68.7</td>
<td>std::vector</td>
<td>〃</td>
</tr>
<tr>
<td>Rust</td>
<td>i32</td>
<td>14.2</td>
<td>7.6</td>
<td>25.8</td>
<td>24.0</td>
<td>Vec</td>
<td>rust 1.63.0</td>
</tr>
<tr>
<td>Rust</td>
<td>i64</td>
<td>14.1</td>
<td>7.6</td>
<td>46.2</td>
<td>46.0</td>
<td>Vec</td>
<td>〃</td>
</tr>
<tr>
<td>Golang</td>
<td>int32</td>
<td>19.2</td>
<td>7.7</td>
<td>105.8</td>
<td>92.4</td>
<td>slice</td>
<td>C1: Go 1.19.6, C2: Go 1.19.8</td>
</tr>
<tr>
<td>Golang</td>
<td>int64</td>
<td>48.9</td>
<td>12.7</td>
<td>171.5</td>
<td>202.0</td>
<td>slice</td>
<td>〃</td>
</tr>
<tr>
<td rowspan="12">JVM</td>
<td>Java</td>
<td>int (Integer)</td>
<td>19.5</td>
<td>8.2</td>
<td>230.4</td>
<td>248.0</td>
<td>ArrayList</td>
<td>〃</td>
</tr>
<tr>
<td>Java</td>
<td>long (Long)</td>
<td>53.0</td>
<td>13.3</td>
<td>269.1</td>
<td>294.1</td>
<td>ArrayList</td>
<td>〃</td>
</tr>
<tr>
<td>Java (GraalVM)</td>
<td>int</td>
<td>21.8</td>
<td>8.2</td>
<td>247.2</td>
<td>260.1</td>
<td>ArrayList</td>
<td>GraalVM CE 22.3.2</td>
</tr>
<tr>
<td>Java (GraalVM)</td>
<td>long</td>
<td>49.3</td>
<td>13.2</td>
<td>281.2</td>
<td>306.4</td>
<td>ArrayList</td>
<td>〃</td>
</tr>
<tr>
<td>Kotlin</td>
<td>Int</td>
<td>19.6</td>
<td>8.1</td>
<td>256.1</td>
<td>276.6</td>
<td>List</td>
<td>Kotlin 1.8.20</td>
</tr>
<tr>
<td>Kotlin</td>
<td>Long</td>
<td>51.8</td>
<td>13.1</td>
<td>294.1</td>
<td>323.0</td>
<td>List</td>
<td>〃</td>
</tr>
<tr>
<td>Kotlin (GraalVM)</td>
<td>Int</td>
<td>17.3</td>
<td>8.1</td>
<td>272.0</td>
<td>294.8</td>
<td>List</td>
<td>Kotlin 1.8.20, GraalVM CE 22.3.2</td>
</tr>
<tr>
<td>Kotlin (GraalVM)</td>
<td>Long</td>
<td>46.6</td>
<td>13.1</td>
<td>310.2</td>
<td>330.9</td>
<td>List</td>
<td>〃</td>
</tr>
<tr>
<td>Scala</td>
<td>Int</td>
<td>24.9</td>
<td>9.5</td>
<td>1081.8</td>
<td>1449.0</td>
<td>mutable.ArrayBuffer</td>
<td>Scala 3.2.2</td>
</tr>
<tr>
<td>Scala</td>
<td>Long</td>
<td>59.8</td>
<td>14.3</td>
<td>662.7</td>
<td>1430.6</td>
<td>mutable.ArrayBuffer</td>
<td>〃</td>
</tr>
<tr>
<td>Scala (GraalVM)</td>
<td>Int</td>
<td>19.3</td>
<td>8.2</td>
<td>245.0</td>
<td>321.8</td>
<td>mutable.ArrayBuffer</td>
<td>Scala 3.2.2, GraalVM CE 22.3.2</td>
</tr>
<tr>
<td>Scala (GraalVM)</td>
<td>Long</td>
<td>50.8</td>
<td>13.4</td>
<td>609.8</td>
<td>706.0</td>
<td>mutable.ArrayBuffer</td>
<td>〃</td>
</tr>
<tr>
<td rowspan="5">Script</td>
<td>JavaScript (Node.js)</td>
<td>Number</td>
<td>17.3</td>
<td>7.8</td>
<td>196.1</td>
<td>203.2</td>
<td>Array</td>
<td>Node.js 18.13.0</td>
</tr>
<tr>
<td>PHP</td>
<td>integer</td>
<td>108.7</td>
<td>43.3</td>
<td>149.1</td>
<td>149.2</td>
<td>array</td>
<td>PHP 8.2.2</td>
</tr>
<tr>
<td>PHP (JIT)</td>
<td>integer</td>
<td>71.9</td>
<td>13.4</td>
<td>152.4</td>
<td>152.5</td>
<td>array</td>
<td>〃</td>
</tr>
<tr>
<td>Python3</td>
<td>int</td>
<td>289.4</td>
<td>160.0</td>
<td>231.5</td>
<td>232.8</td>
<td>list</td>
<td>Python 3.11.2</td>
</tr>
<tr>
<td>Ruby</td>
<td>Integer</td>
<td>380.0</td>
<td>160.8</td>
<td>57.6</td>
<td>57.7</td>
<td>Array</td>
<td>Ruby 3.1.2</td>
</tr>
</tbody></table>
</div>
<h2>グラフ</h2>
<span style="color: #71a1e8;">薄い青: AOT Compile (32bit)</span>
<span style="color: #1c5bca;">濃い青: AOT Compile (64bit)</span>
<span style="color: #c27ea1;">薄い赤紫: JVM (32bit)</span>
<span style="color: #741b47;">濃い赤紫: JVM (64bit)</span>
<span style="color: #674ea7;">薄い紫: JVM/GraalVM (32bit)</span>
<span style="color: #351c75;">濃い紫: JVM/GraalVM (64bit)</span>
<span style="color: #e69138;">橙色: Script</span>
<h3>CPU1 (Core i7-8559U)での実行時間</h3>
<div><img width="1200rem" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vTqRcsX98o2bbV67JDZhwZdLiieBq74mO-F__mqwlhwdcXp-sGbjWsAFy5s7JBDMiT2aKLmz63rKyeg/pubchart?oid=1613535073&format=image"/>
</div>
<h3>CPU2 (Core i9-12900K)での実行時間</h3>
<div><img width="1200rem" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vTqRcsX98o2bbV67JDZhwZdLiieBq74mO-F__mqwlhwdcXp-sGbjWsAFy5s7JBDMiT2aKLmz63rKyeg/pubchart?oid=605515441&format=image"/>
</div>
<h2>コメント・感想</h2>
<h4>全般的な実行時間の傾向</h4>
<ul>
<li>AOT (Ahead-Of-Time)コンパイル型の言語は、おおよそ同じオーダーの実行性能で速い</li>
<li>次いでJVM上で実行される言語が続く。多少の差はあるが、これらの実行時間もだいたい同じ</li>
<li>GraalVM上での実行では、OpenJDKより若干よいケースもある</li>
<li>Script系の言語は、Node.jsが群を抜いて速い</li>
<li>PHPのJITも一定の効果はある(約1.5〜3倍)</li>
</ul>
<h4>32bit長と64bit長の整数型について</h4>
<ul>
<li>概して64bit長の数値型を使った場合、32bit長の数値型を使った場合の1.5〜4倍程度、実行時間を要した</li>
<li>ただし、<span style="color: blue;">Rustでは、i32とi64を使った場合でほぼ同じ。</span>最大メモリ使用量は期待に近いが、実行時間が32bitとほぼ同じなのはなぜ?(コードの誤り?)</li>
<li>Core i9-12900Kのほうが32bit長と64bit長整数の乖離が小さい傾向にある</li>
<li>メモリ使用量は、32bit長と64bit長整数で大きな差はない。JVM系に関しては64bit長のほうがやや使用量が多いように思える。これは実行環境の搭載メモリ量が多いで単に多くヒープを使用しているだけかもしれない</li>
</ul>
<h4>Template/Generics</h4>
<ul>
<li>C++, Rust, Goでは、32bit長と64bit長版をなるべく共通のコードとするためにTemplate/Genericsを用いた。同じ条件なら<a href="https://transparent-to-radiation.blogspot.com/2023/04/20234.html">前回</a>の結果と大きく変わらなかったので、Template/Genericsによる性能のオーバーヘッドもほぼないと考えられる</li>
<li>Java, Kotlinに関しては、そもそもGenericsで実現する方法が分からなかった。ベースクラスで基本的な計算をして、型に固有の処理をサブクラスでオーバーライドするような設計も考えたが、他の言語と実装が乖離しそうなのでそのアプローチも諦めた。単純に同じコードで数値型の異なるクラスを2つ用意した。</li>
<li>Scalaに関しては、Integral traitで実現しようとしたが、かなり(3〜4倍)実行時間が増加しそうだったので、Genericsの使用を諦めた</li>
</ul>
<style>
.nowrap-20230501-001 td:nth-child(1),
.nowrap-20230501-001 td:nth-child(2),
.nowrap-20230501-001 td:nth-child(3),
.nowrap-20230501-001 td:nth-child(4),
.nowrap-20230501-001 td:nth-child(5),
.nowrap-20230501-001 td:nth-child(6){
white-space: nowrap;
}
.nowrap-20230501-001 span {
display: inline-block;
}
<!--
table.nowrap-20230501-001 {
min-width: 1000px;
}-->
</style>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com3tag:blogger.com,1999:blog-9025125736498115608.post-48026838433317753612023-04-11T07:46:00.024+09:002023-09-10T21:38:58.011+09:00Xvfbを使って、LinuxのGUI環境(デスクトップ)をコンテナ内に作成し、Webブラウザでアクセス<p>Webブラウザで試験をしたり、GUIによるインタラクティブな処理をするなど、Linuxデスクトップを使いたい場合があります。一般的にLinuxデスクトップ(やベースシステムであるX11)はそのPCに装着されているビデオカードを使用します。そのため、コンテナのようにホストOSのビデオカードにアクセスできない環境ではGUIが基本的に使えません
</p>
<p>この記事では、Linuxマシンのコンテナ内にXvfbという仮想的なグラフィックカードドライバを使ってLinuxデスクトップを作成する方法を紹介します。以下では、コンテナ内での設定・実行方法を前提に説明しますが、もちろんホストOS上でも「<a href="#config">ソフトウェアのインストール・設定</a>」項目以降の操作を行うことで同様に実行することが可能です。
</p>
<h2>全体構成</h2>
<p>下図のような構成を構築します。Xvfbは、仮想ビデオドライバを使用するX11サーバです。x11vncは、Xvfbの画面をVNCプロトコルに変換して、外部からVNCでアクセスできるようにするVNCサーバです。外部にVNCクライアントがあれば、この2つのソフトウェアでアクセスできます。
</p><p>
下図ではさらに、WebSockifyというソフトウェアを使用しています。これは、VNCをHTTPに変換するサーバです。つまり、VNCクライアントの変わりにWebブラウザでVNCサーバにアクセスできるようになります。
</p>
<div><img src="https://docs.google.com/drawings/d/e/2PACX-1vQNh02ayCUGP_ZL9UfmM82RFnvUqjFzj2h6PZOIr-xZzXDRhVvfoxhvk0KXWTc1S7xzJtHxkWJWwiBF/pub?w=1246&h=455" width="800rem" /></div>
<h2>コンテナの作成</h2>
<p>
ここではコンテナイメージとして、Debian 11 (bullseye)を使用します。
また、LXCと使う場合と、Dockerを使う場合を紹介します。
LXCは、一度作成した環境を引き続き利用する場合に便利です。
Dockerはその環境を使い捨てで使用する場合に便利です。
コンテナの作成は、両者で若干異なりますが、ソフトのインストール方法や設定は同じです。
</p>
<p>
以下のコマンドをリモートマシンのホスト上で実行します。
</p>
<h3>LXCコンテナの場合</h3>
<pre>sudo lxc-create -n mycontainer -t debian -- -r bullseye
</pre>
<h4>作成したLXCコンテナのシェル取得方法</h4>
<pre>sudo lxc-attach -n mycontainer bash</pre>
<h3>Dockerコンテナの場合</h3>
<pre>docker run --net host -it debian:11 bash</pre>
上記では、ポートフォワードなどの設定を省略するために`--net host`を指定し、ホストOSのネットワークをそのままコンテナで使用します。セキュリティなどの理由で、ブリッジなどを使いたい場合、適宜変更ください。
<h2 id="config">ソフトウェアのインストール・設定</h2>
続いて、コンテナ内で以下のコマンドを実行します。
<h3>コンテナ内にユーザを作成</h3>
ユーザを作成するのが面倒な場合、rootで続行してもかまいません。中長期的に使用する場合、ユーザを作成するほうが安全で便利です。
<h3>パッケージのインストール</h3>
<pre>apt update && apt install xvfb openbox x11vnc websockify novnc
</pre>
<h2>Xvfbと関連サーバの実行</h2>
以下のコマンドをコンテナ内で実行します。青字の部分は他と重複しないように適宜変更ください。以下のコマンドはフォアグランドで実行されるので、続くコマンドは別の端末で実行します。
<h3>Xvfb</h3>
<pre>xvfb-run -f ~/.Xauthority -n <span style="color: #2b00fe;">10</span> -s "-screen 0 <span style="color: #800180;">800x600x24</span>" openbox
</pre>
上記の例では、openboxというWindow Managerを起動しています。他に使用したいWindows Managerやデスクトップ環境のプログラムがある場合、それを指定します。上記の紫色のパラメータがルートウィンドウの解像度と色深度です。これも必要に応じて変更ください。
<h4>直接Xvfbを実行する場合</h4>
<pre>
Xvfb :10 -screen 0 800x600x24
</pre>
<h3>x11vnc</h3>
<pre>x11vnc -display :<span style="color: #2b00fe;">10</span> -rfbport <span style="color: #2b00fe;">5910</span> -forever -localhost
</pre>
上記の`-localhost`オプションは、localhostのみからVNC接続を許可するオプションです。WebSockifyを使わず、VNCクライアントでx11vncに直接アクセスする場合は、このオプションを削除ください。
<h4>パスワード</h4>
パスワードをつける場合、<tt>vncpasswd</tt>コマンドでパスワードを作成します。それを<tt>-rfbauth ~/.vnc/passwd</tt>のように上記のコマンドに追加します。
<h3>WebSockify</h3>
<pre>websockify --web=/usr/share/novnc <span style="color: #2b00fe;">8010</span> localhost:<span style="color: #2b00fe;">5910</span>
</pre>
<h2>Webブラウザから接続</h2>
以下のURLにWebブラウザでアクセスするとXの画面が表示されます。
<ul>
<li><tt>http://[コンテナのIP]:8010/vnc.html</tt></li>
</ul>
起動直後は真っ黒です。マウスを右クリックをすると以下のキャプチャ画像のようにopenboxのコンテキストメニューが表示されます。
<div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzc4JP9nkKeD7WwkdRfAGTiVYbgMPa_6BqrX8yOdh37UB2p4V4MTK5BUZeOj7QA-wWOBVdUvIwbnuoG7nW0xB16CDNQJEsisTyIH6gbf7eBwtBP6h_vPSSCw4lTK--3evTf4RNwjFPgkdv0WS9dk-HHPG1-2BtH4-LnfHywY-f9Z36xFAJVn0lT04/s1600/ctx-menu.png" width="610px" /></div>
Terminal emulatorを選択すると、次のようにxtermが起動します。
<div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinnazSykVgmyKDQjwFrBefaDdsf7p66u52CA9tneqXLAqZYMSG9FC566Td13t4davCPnpEGiY5n7dtVDdSbfvD6fliyiCLykBZqFklpEumXqGyQ9fnWLeA0FCcW_nV5UezSqJMlRLtFNtu6JWBsVK_01B69bXPmeKWximl5B7NcVMb4OPLtG3EdAQ/s1600/xterm.png" width="609px" /></div>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-75742446085796260312023-04-01T22:39:00.033+09:002023-08-20T07:09:47.860+09:00プログラミング言語の実行速度比較(2023/4)<h2>お知らせ</h2>
この記事へのフィードバックを受けて、以下に更新版「プログラミング言語の実行速度比較(2023/5)」を公開しています。コメントをお寄せくださった皆様ありがとうございます。
<ul>
<li><a href="https://transparent-to-radiation.blogspot.com/2023/05/20235.html">プログラミング言語の実行速度比較(2023/5)</a></li>
</ul>
<h2>はじめに</h2>
2019年に「<a href="https://transparent-to-radiation.blogspot.com/2019/02/blog-post.html">言語間の速度比較</a>」という記事を投稿した。
それから4年近く経過したので、それぞれの言語の最新版で再度検証する。また、サポートが終了したPython2の代わりに近年人気が高いRustを追加する。さらにC言語で算出した素数の格納をrealloc()で確保した領域にする評価も追加した。評価には、シングルスレッドで順次既知の素数で割ることで1億までの素数を求めるプログラムを使用(ソースは<a href="https://github.com/kz0817/mylab/tree/prime-number-2023/prime-number">ここ</a>)
<div class="scroll-box">
<table class="nowrap-20230401-001">
<tbody><tr>
<th>言語</th>
<th>時間 (sec)</th>
<th><span>最大使用</span><span>物理メモリ</span>(MiB)</th>
<th><span>算出素数格納</span><span>コンテナ</span></th>
<th>補足情報</th>
<th>感想</th>
</tr>
<tr>
<td>C</td>
<td>12.6</td>
<td>25.1</td>
<td>固定長配列</td>
<td>gcc 12.2.0<br />最適化-O3</td>
<td>-</td>
</tr>
<tr>
<td>C</td>
<td>12.6</td>
<td>23.9</td>
<td>realloc()</td>
<td>gcc 12.2.0<br />最適化-O3</td>
<td>固定長配列よりメモリ使用量が少ないが、処理時間は同じ。ある程度、数が大きくなると新しい素数の追加が少なくなるからか。</td>
</tr>
<tr>
<td>C++</td>
<td>66.5</td>
<td>36.5</td>
<td>std::vector</td>
<td>gcc 12.2.0<br />最適化なし(-O0でビルド)</td>
<td>-</td>
</tr>
<tr>
<td>C++</td>
<td>12.7</td>
<td>35.6</td>
<td>std::vector</td>
<td>gcc 12.2.0<br />最適化(-O3でビルド)</td>
<td>最適化するとやはりかなり速くなる。メモリ使用量もC言語とRust以外の言語と比べて圧倒的に少ない</td>
</tr>
<tr>
<td>Rust</td>
<td>14.2</td>
<td>23.9</td>
<td>Vec</td>
<td>1.63.0</td>
<td>C++に匹敵する速さ。メモリ消費はむしろ少ない。それでいて安全性が高いとくれば次世代の主役の可能性あり</td>
</tr>
<tr>
<td>JAVA</td>
<td>19.5</td>
<td>228.9</td>
<td>ArrayList</td>
<td>OpenJDK 17.0.6</td>
<td>C/C++の約1.5倍の実行時間。これまでの経験ともだいたい整合する</td>
</tr>
<tr>
<td>Kotlin</td>
<td>19.6</td>
<td>256.2</td>
<td>List</td>
<td>Kotlin 1.8.20</td>
<td>Javaと同等。コードの書きやすさを考えると悪くない選択肢</td>
</tr>
<tr>
<td>Scala</td>
<td>24.9</td>
<td>1078.4</td>
<td>mutable.ArrayBuffer</td>
<td>Scala 3.2.2</td>
<td>速度面ではJavaと比較してやや劣る程度だが、メモリ使用量がJavaの約4倍、C++の30倍近い。</td>
</tr>
<tr>
<td>Golang</td>
<td>48.9</td>
<td>168.1</td>
<td>slice</td>
<td>go1.19.6 </td>
<td>予想より速くない。メモリ使用量もJavaの半分程度で、この結果だけだと使いみちが中途半端となるかも。</td>
</tr>
<tr>
<td>Node.js</td>
<td>17.3</td>
<td>196.1</td>
<td>Array</td>
<td>v18.13.0</td>
<td>JavaやScalaを凌駕。メモリ使用量もそれらよりやや少ない。</td>
</tr>
<tr>
<td>PHP</td>
<td>109.5</td>
<td>149.4</td>
<td>array</td>
<td>PHP 8.2.2</td>
<td>特に良いところもないような。無理に使うような言語ではないと思う。</td>
</tr>
<tr>
<td>Python3</td>
<td>289.4</td>
<td>231.5</td>
<td>list</td>
<td>3.11.2</td>
<td>圧倒的に遅い。メモリ使用量は他のスクリプトと同程度。直接アルゴリズムを組んでごりごりやる言語ではない。今回の評価観点は一番不向きな用途だろう。</td>
</tr>
</tbody></table>
</div>
<h3>評価環境</h3>
<ul>
<li>Intel Core i7 8559U (2.7GHz)</li>
<li>DDR4 2400MHz 32GiB</li>
<li>Debian 12 (sid)</li>
</ul>
<div>
<img width="900rem" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vTqRcsX98o2bbV67JDZhwZdLiieBq74mO-F__mqwlhwdcXp-sGbjWsAFy5s7JBDMiT2aKLmz63rKyeg/pubchart?oid=1791030704&format=image"/></div>
<style>
.nowrap-20230401-001 td:nth-child(1),
.nowrap-20230401-001 td:nth-child(2),
.nowrap-20230401-001 td:nth-child(3),
.nowrap-20230401-001 td:nth-child(4){
white-space: nowrap;
}
.nowrap-20230401-001 span {
display: inline-block;
}
table.nowrap-20230401-001 {
min-width: 1000px;
}
</style>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com4tag:blogger.com,1999:blog-9025125736498115608.post-7277331144616114362023-03-30T22:01:00.011+09:002023-04-01T23:15:12.548+09:00リモートマシンのファイル群のtarアーカイブをリモートマシンに一時ファイルを作成しないでsshで取得する<h2>ありがちな方法(一時ファイル作成)</h2>
リモートマシンのファイル群をtarアーカイブとして取得する場合、以下のようのリモートマシンで一度tarアーカイブを作成することは、よく見る状況である。
<ol>
<li>リモートマシンにSSHでログイン</li>
<li>リモートマシンで、<tt>tar</tt>コマンドを実行してtarアーカイブを作成する</li>
<li>ローカルマシンから<tt>scp</tt>で、リモートマシンのtarアーカイブをコピー</li>
<li>リモートマシンで、tarアーカイブを削除</li>
</ol>
<div><img width="700rem" src="https://docs.google.com/drawings/d/e/2PACX-1vS3BmO6V2deItrObMvuL5fXt6T0ZhJiYMcrcEU9I2ZxC4mX-1R3Vx25pkUWwm9O2PFeQ26LvPd16cNy/pub?w=1014&h=287"/></div>
この方法の欠点は、リモートマシンに一時的にtarアーカイブを保存する空き容量が必要なことである。
大量のファイルをローカルにコピーするときは、これがネックになる。
<h2>一時ファイルを作らない方法</h2>
リモートマシンremoteの/home/foo以下をすべてtarアーカイブ<tt>foo.tar.gz</tt>としてバックアップする場合、
ローカルマシンで以下のように入力する。
<pre>ssh remote <span style="color: #2b00fe;">tar czf - /home/foo </span>> foo.tar.gz
</pre>
上記の青字の部分は、リモートマシンで実行されるコマンドである。リモートで実行したコマンドの標準出力は、ローカルのsshコマンドそのものの標準出力に出力される。上記でtarの出力ファイルとして<tt>-</tt>(標準出力)を指定しているので、結果としてローカルのsshの標準出力にtarアーカイブの内容が出力される。そこで<tt>> foo.tar.gz</tt>でローカルのファイルにリダイレクトすれば、そのままtarアーカイブとなる。これを図にすると次のイメージである。
<div><img width="640rem" src="https://docs.google.com/drawings/d/e/2PACX-1vQ8gRqsR1GHnE8KLljS8JBPdQU5m3ZYOok4s_odtJUos4f53qrZ3g6rPccN30dLdBFOt-CXL3pgZfs2/pub?w=928&h=278"/></div>
なお、標準入出力については下記を参照。
<ul><li><a href="https://transparent-to-radiation.blogspot.com/2023/03/linux_20.html">Linuxでのプロセスの標準入出力 </a></li></ul>
また、tarをカレントディレクトリが/home/fooで実行させるには以下のようにする。
<pre>ssh remote "(cd /home/foo; tar czf - .)" > foo.tar.gz</pre>
<h2>多段SSHごしでのtarアーカイブ取得</h2>
<tt>local -> remote -> remote2</tt>のようにremoteを介してremote2へ多段SSHして、remote2のファイル群のtarアーカイブを直接取得することもできる。
<pre>
ssh <span style="color: #2b00fe;">-J remote</span> remote2 tar czf - /home/goo > goo.tar.gz
</pre>
<div><img width="776rem" src="https://docs.google.com/drawings/d/e/2PACX-1vSj11KZOE0EVwRoosxFmgarbRPaZBIIHgdQw7X97O6JeayL3bcE84nJSc27-_UThq-cvI6Vm6D2zMSA/pub?w=1124&h=275"/></div>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-41015402124837281382023-03-30T21:15:00.006+09:002023-04-06T19:54:55.373+09:00lxc-createでバージョンを指定してDebianコンテナを作成する<h3>例:Debian 12 (bookworm)をインストール</h3>
<pre># lxc-create -n name -t debian -- -r <span style="color: #2b00fe;">bookworm</span>
</pre>
他のバージョンをインストールする場合、上記の青字の部分を下のcode nameに置換する。
<table>
<tbody><tr>
<th>version</th><th>code name</th>
</tr><tr>
<td>10</td><td>buster</td>
</tr><tr>
<td>11</td><td>bullseye</td>
</tr><tr>
<td>12</td><td>bookworm</td>
</tr>
</tbody></table>
<h2>[付録] 初期状態のでプロセス</h2>
<h3>Debain 10</h3>
<pre>
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
</pre>
<h3>Debian 11</h3>
<pre>
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
</pre>
<h3>Debian 12</h3>
<pre>
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
</pre>
<h3>参考</h3>
<a href="https://transparent-to-radiation.blogspot.com/2023/03/lxc.html">LXCの記事一覧</a>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-23816656282022937212023-03-29T22:19:00.001+09:002023-04-04T22:15:12.841+09:00make入門 #4 組み込みルール<h2>組み込みルールの概要</h2>
前回(<a href="https://transparent-to-radiation.blogspot.com/2023/03/make-3.html">make入門 #3 自動変数とパターンルール</a>)は以下のようなパターンルールについて説明しました。
<pre>prog2: main.o sub.o
gcc -o $@ $^
<span style="color: #2b00fe;">%.o: %.c
gcc -c -o $@ $<</span>
main.o: main.c sub.h
sub.o: sub.c sub.h
</pre>
ここで青字で示されるパターンルールをMakefileから削除してみます。
<pre>prog2: main.o sub.o
gcc -o $@ $^
main.o: main.c sub.h
sub.o: sub.c sub.h
</pre>
このMakefileをカレントディレクトリに配置してmakeを実行します。
<pre>$ make
cc -c -o main.o main.c
cc -c -o sub.o sub.c
gcc -o prog2 main.o sub.o
</pre>
なんと、このMakefileでもビルドが成功します。
とくに驚くべきことは、*.cから*.oを作成する方法を指定しなていにもかかわらず、コンパイルが実行されています。
実は、makeはデフォルトのパータンルールを持っており、パターンルールが明示されていない場合、そのデフォルトのルールが使用されます。
このパターンルールを組み込みルールと呼びます。
<h2>C言語用の組み込みルール</h2>
以下のGNU Makeの公式マニュアルに組み込みルールが列挙されています。
<ul><li><a href="https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html">Catalogue of Built-In Rules</a></li></ul>
この中で*.cから*.oを作成する組み込みルールは以下のように記載されています。
<pre>$(CC) $(CPPFLAGS) $(CFLAGS) -c
</pre>
さらに、上記の変数の<tt>$(CC)</tt>なども組み込みのデフォルト値があります。以下に記載されています。
<ul><li><a href="https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html">Variables Used by Implicit Rules</a></li></ul>
上記のサイトに記載されている、それぞれの変数のデフォルト値を以下に示します。
<table>
<tbody><tr>
<th>変数</th><th>デフォルト値</th>
</tr><tr>
<td><tt>CC</tt></td>
<td><tt>cc</tt></td>
</tr><tr>
<td><tt>CPPFLAGS</tt></td>
<td><tt>(なし)</tt></td>
</tr><tr>
<td><tt>CFLAGS</tt></td>
<td><tt>(なし)</tt></td>
</tr>
</tbody></table>
これらの変数をMakefile内で以下のように上書きできます。
<pre><span style="color: #2b00fe;">CFLAGS = -g3 -O2</span>
prog2: main.o sub.o
gcc -o $@ $^
main.o: main.c sub.h
sub.o: sub.c sub.h
</pre>
このMakefileを使ってmakeを実行すると以下のように<tt>CFLAGS</tt>に設定したオプションが付与されています。
<pre>cc <span style="color: #2b00fe;">-g3 -O2</span> -c -o main.o main.c
cc <span style="color: #2b00fe;">-g3 -O2</span> -c -o sub.o sub.c
gcc -o prog2 main.o sub.o
</pre>
<h2>まとめ</h2>
<p>
本記事では、組み込みルールについて説明しました。
</p>
<p>
以下には、make入門の全記事がリストアップされています。
</p><ul>
<li><a href="https://transparent-to-radiation.blogspot.com/p/make.html">make入門</a></li>
</ul><p></p>
</tt>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-29057876543228730522023-03-28T08:08:00.002+09:002023-03-28T08:21:06.584+09:00私の.screenrcを紹介します<h3>エスケープキーを^Tに設定</h3>
<pre>
escape ^Tt
</pre>
<h3>スタートアップメッセージを非表示</h3>
<pre>
startup_message off
</pre>
<h3>キャプション(ステータスライン)の設定</h3>
<pre class="wrap">
# %` : バクチクコマンドの結果
# %-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 %<"
</pre>
上記の設定によるステータスラインの例。白い背景色のラインで、カレントウィンドウは白黒を反転。ウィンドウ番号は水色。
<div><img width="700rem"src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZJm4TEyW-e4wG_ZzUjr5yXz3uuq8xHdA3cCtb64NCeuGWPmmnXQTTLef_DcGD99FwTo7iTmPLufn3881Lh2YCUrZA5Pxd8Xegt6gQVoVbVt3GhPvXVZgRymaSrVwizp6EdvoJvcNdIv8vfs6kq6fmuBP4NypY7jc3cK5yLs4j-UtP6tHPSpINTls/s1600/Screenshot%20from%202023-03-28%2007-59-27.png"/></a></div>
<h3>ハードステータスを無視</h3>
<pre>
hardstatus ignore
</pre>
<h3>文字コードをUTF8に</h3>
<pre>
encoding utf8
</pre>
<h3>スクロールバック行数を設定</h3>
<pre>
defscrollback 1024
</pre>
<h3>画面を分割したときの、ウィンドウの移動やサイズ変更のためのキーバインド</h3>
<pre class="wrap">
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
</pre>
<h3>誤ってフローコントロール操作(XON/XOFF)をしないよう、それらのキーバインドを無効化</h3>
通常、フローコントロールを必要とすることはほぼないが、端末でフローコントロールを有効にしてしまうと
文字が入力できなくなり、すこしビックリする。そのため、徹底的にフローコントロールが発生しないようにキーバインドを設定。
<h4>フローコントロール開始・終了のキーバインドを無効化</h4>
<pre>
bind s
bind ^s
bind q
bind ^q
</pre>
<h4>フローコントロールモード変更のキーバインドを無効化</h4>
<pre>
bind f
bind ^f
</pre>
<h4>デフォルトのフローコントロールをOFFにして、現在設定もOFFに</h4>
<pre>
defflow off
flow off
</pre>
<h3>レジスタをペーストするためのキーバインド</h3>
<pre>
bind P paste
</pre>
<h4>レジスタaの内容をペーストするキー操作</h4>
<ul><li>
<tt>^t P a</tt>
</li></ul>
<h4>レジスタaに文字列を登録</h4>
<ul><li>
<tt>^t :register a [登録する文字列]</tt>
</li></ul>
<h3>ウィンドウのタイトルを設定</h3>
<pre>
shelltitle "$ |bash"
</pre>
<h3>ヴィジュアルベルをOFFに</h3>
<pre>
vbell off
</pre>
<h3>256色表示設定</h3>
<pre>
term screen-256color
</pre>
<h3>ログを有効化</h3>
<pre>
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"
</pre>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-33660962409589424852023-03-26T21:24:00.010+09:002023-03-29T08:20:11.456+09:00make入門 #3 自動変数とパターンルール前回(<a href="https://transparent-to-radiation.blogspot.com/2023/03/make-2.html">make入門 #2 複数のルール</a>)は、複数のルールからなるMakefileについて説明しました。
その際に気づいた方もいるかもしれませんが、ファイル名などが反復して使用されています。
今回は、反復した記述を少なくし、よりシンプルにMakefileを記述するための機能である自動変数とパターンルールを説明します。
<h2>自動変数を使って記述</h2>
以下は前回のMakefileです。
<pre>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
</pre>
これを自動変数を使うと次のように記述することができます。<tt>$@</tt>や<tt>$^</tt>のように<tt>$</tt>から始まる単語が自動変数です。
それぞれの意味を下の表に示します。
<pre>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 $@ $<
</pre>
<table>
<tbody><tr>
<th>自動変数</th>
<th>説明</th>
</tr><tr>
<td><tt>$@</tt></td>
<td>ターゲット(入力)ファイル(コロンの左側)</td>
</tr><tr>
<td><tt>$^</tt>
</td><td>すべての依存(出力)ファイル(コロンの右側のファイル全て)</td>
</tr><tr>
<td><tt>$<</tt>
</td><td>最初の依存ファイル(コロンの右側の最初のファイル)</td>
</tr>
</tbody></table>
このMakefileをカレントディレクトリに配置してmakeを実行すると以下のように自動変数が、具体的なファイル名に置換されて実行されていることが分かります。
<pre>$ make
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o prog2 main.o sub.o
</pre>
<h2>パターンルール</h2>
上記の自動変数を使ったMakefileでmain.oとsub.oを作成するコマンドが同じになっています。ソースコードが増えていっても、同様の記述になるでしょう。
Makefileは、*.cから*.oを作成するような同じコマンドになるルールを共通化する仕組みを持っています。この仕組みをパターンルールと呼びます。
パターンルールを使って、記載したMakefileの例を以下に記載します。
<pre>prog2: main.o sub.o
gcc -o $@ $^
<span style="color: #2b00fe;">%.o: %.c
gcc -c -o $@ $<</span>
main.o: main.c sub.h
sub.o: sub.c sub.h
</pre>
<p>
青字で示した<tt>%.o: %.c</tt>という行があります。これは、*.cから*.oを作るルールという意味です。
そのコマンドとして、gccを使ったコンパイル処理が記述されています。ここでの<tt>$@</tt>や<tt>$<</tt>は
実際のファイルに置換されるため、自動変数を使うとファイル名だけ異なる類似の処理をひとつのコマンドとして記載できます。
</p>
<p>
また、main.oとsub.oのルールにはコマンドがありません。具体的なコマンドはパターンルールで定義してあるため、
ここでは入出力(依存)関係のみを記述すればよくなります。
</p>
<h2>まとめ</h2>
<p>
本記事では、自動変数とパターンルールについて説明しました。
</p>
<p>
以下には、make入門の全記事がリストアップされています。
</p><ul>
<li><a href="https://transparent-to-radiation.blogspot.com/p/make.html">make入門</a></li>
</ul><p></p>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0tag:blogger.com,1999:blog-9025125736498115608.post-63198382093822234812023-03-26T15:15:00.004+09:002023-03-26T15:15:42.367+09:00Linuxカーネルの主要なCONFIGLinuxの主要なCONFIGを以下のテーブルに記載します。とくに<tt>make defconfig</tt>で有効化されないものを中心に記載します。
また、この記事の内容はLinux 6.2.7をベースに作成されています。
<table>
<tr>
<th>CONFIG</th>
<th>説明</th>
</tr><tr>
<td>BRIDGE</td>
<td>ブリッジ機能</td>
</tr><tr>
<td>SQUASHFS</td>
<td>squashfsサポート</td>
</tr><tr>
<td>SQUASHFS_XATTR</td>
<td>squashfsでのxattrのサポート</td>
</tr><tr>
<td>OVERLAY_FS</td>
<td>オーバイレイFSのサポート。Dockerなどで使用されている。</td>
</tr><tr>
<td>FUSE_FS</td>
<td>FUSE FSのサポート</td>
</tr>
</table>
<h3>CONFIGの追加例</h3>
CONFIG_BRIDGEを有効にする例を示します。Linuxのソースディレクトリで次のコマンドを実行すると、最初は以下のように無効化されています。
<pre>
$ cat .config | grep CONFIG_BRIDGE
# CONFIG_BRIDGE is not set
</pre>
有効化するには以下を実行します。
<pre>
scripts/config --enable BRIDGE
</pre>
再度.configを確認すると有効化されています。
<pre>
$ cat .config | grep CONFIG_BRIDGE
CONFIG_BRIDGE=y
</pre>
また、この変更に伴って新たに設定可能になったCONFIGを以下で確認できます。
<pre>
$ make listnewconfig
CONFIG_BRIDGE_NF_EBTABLES=n
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_MRP=n
CONFIG_BRIDGE_CFM=n
</pre>
これらについて個別に設定しても良いですし、以下のようにするとデフォルトに設定できます。
<pre>
make olddefconfig
</pre>
<h2>参考記事</h2>
<ul><li><a href="https://transparent-to-radiation.blogspot.com/2023/03/linux.html">Linuxカーネルのビルド方法</a></li></ul>ずーくんhttp://www.blogger.com/profile/13304123171376761204noreply@blogger.com0