シリアルコンソールで、ターミナルサイズを変更する方法

シリアルコンソールを使うとデフォルトでは、ターミナルサイズが80x25になっていることが多い。
# stty size
25 80
これを実際の仮想端末のサイズにフィットするには以下のコマンドを実行する
# setterm --resize
すると、ターミナルサイズが変更される
# stty size
51 204

Ubuntu上で新しいバージョンのDebianのLXCコンテナを作る方法

例えば、Ubuntu 20.04上でDebian12のLXCコンテナを作成すると、'signed by unknown key'(知らない鍵で署名されている)と表示されエラーとなる。
# 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) " 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
次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。
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

Xvfbにxrandrで解像度を追加する

追加したい解像度を引数にして、cvtコマンドを実行する。
$ 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コンテナの中でDockerを使用するための設定

/var/lib/lxc/[container名]/configに以下の設定を追加し、コンテナを(再)起動する。

なるべく安全な方法

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 =

Ethernet、UDP、TCPパケットの構造

Ethernetパケット

ヘッダサイズ: 14B (802.1Q VLANタグがある場合18B)、チェックサムサイズ: 4B
サイズ (B)説明
6送信先MAC
6送信元MAC
[4]802.1Qタグ (VLANタグ)
2Ethernet type/size. IPv4:0x0800, IPv6:0x86dd
-ペイロード(IPなど)
4FCS (Frame Check Sequence; CRC)
参考: Wikipedia: イーサーネットフレーム

IPv4

ヘッダサイズ: 20B (拡張情報を除く)
サイズ (B)説明
1バージョン(MSB 4bit)、ヘッダ長(LSB 4bit) 4オクテット単位
1サービス種別
2全長(IPヘッダを含む)
2識別子
2フラグ(MSB 3bit)、フラグメントオフセット(LSB 13bit)
1TTL (Time to Live)
1上位プロトコル. ICMP: 0x01, TCP:0x06, UDP:0x11
2IPヘッダのチェックサム
4送信元アドレス
4送信先アドレス
[2]拡張情報
-データ
参考: Wikipedia: IPv4

UDP

ヘッダサイズ: 8B
サイズ (B)説明
2送信元ポート
2送信先ポート
2データ長
2チェックサム
-ペイロード(IPなど)
参考: Wikipedia: UDP

TCP

ヘッダサイズ: 20B >
サイズ (B)説明
2送信元ポート
2送信先ポート
4シーケンス番号
4確認応答番号
2ヘッダ長(MSB 4bit)[32bit単位]、予約(3bit)、フラグ(9bit)
2Windowサイズ
2チェックサム
2緊急ポインタ
[4-40]オプション
-ペイロード
参考: Wikipedia: TCP

QEMUでLinuxカーネルをGDBでデバッグする

QEMUの起動

以下の2つのオプションを使う
オプション説明
-sTCP 1234番でGDBのリモートコクションをオープンします
-SGDBにアタッチされるまでゲストの実行を待機します。カーネルの起動後にアタッチしても問題ない場合、不要です。

Linuxの起動オプション

QEMUで起動されるLinuxカーネルのコマンドラインオプションにnokaslrを付与する。通常、GRUBなどのブートローダーに指定する。このオプションは、カーネルの関数の配置アドレスのランダム化を抑止する。このオプションを指定しない場合、カーネルのデバッグ情報に記載されているアドレスと、実際のアドレスがことなり、GDBの操作が期待どおりに行われない。

デバッグ情報の入手

ターゲットのカーネルに対応するデバッグ情報ファイルを取得する。

Debianの場合の例

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

自分でビルドしたカーネルの場合

カーネルのビルドディレクトリにvmlinuxがあるのでそれを使う。ただし、ビルド時、以下の点に留意
  • 以下のCONFIGを有効化
    • CONFIG_DEBUG_INFO_DWARF5、または、CONFIG_DEBUG_INFO_DWARF4
    • CONFIG_GDB_SCRIPTS
    • CONFIG_FRAME_POINTER
  • 以下のCONFIGを無効化
    • CONFIG_DEBUG_INFO_REDUCED
参考: https://docs.kernel.org/dev-tools/gdb-kernel-debugging.html

GDBの起動

デバッグ情報付きのvmlinuxを引数にしてGDBを起動する
gdb /usr/lib/debug/vmlinux-5.10.0-22-amd64
GDB起動後、以下のコマンドを実行する
(gdb) target remote [QEMU起動マシンのアドレス]:1234

グローバル変数の表示例

(gdb) p jiffies
$1 = 4295462764

ブレークポイントの例

do_sys_openにブレークポイントを仕掛けて、ゲストOSでファイルを開く操作をすると以下のようにブレークする
(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

実行中のプロセスのtask_structの表示例

上記のブレーク例は、lsを実行したときのものである。このときのプロセスが確かにlsであることと、そのプロセスIDを確認する。
(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
上記について補足する。実行中のプロセスのtask_struct構造体へのポインタは、CPUごとの変数領域の中にあり、グローバル変数current_taskの値は、その領域におけるオフセットである。また、CPUごとの変数領域の開始位置はGSセグメントレジスタに格納されている。そのため、両者を加算したアドレス位置に実行中のプロセスに関するtask_struct領域へのポインタが格納されている。

参考

ふるさと納税でおおすすめの返礼品: バンバーグ編

ハンバーグ大好きな私が、ふるさと納税の返礼品でおすすめのハンバーグを紹介します。一概に優劣はつけにくいが、好きなものから順に紹介する。

兵庫県淡路市: 淡路島玉ねぎのBIG生ハンバーグ 200g×10個

玉ねぎ入り。けど玉ねぎが強すぎず、いい意味で肉感が減少して、すこしあっさり目で飽きない。

岩手県一関市:《格之進》金格ハンバーグ120g×6個

やや小ぶりだが、その分、美味しさが凝縮されている。高いレベルでバランスが良い。

佐賀県吉野ヶ里町: 佐賀牛入り 黒毛和牛 ハンバーグ 12個 大容量 1.8kg (150g×12個)

肉感が高く、肉の香り、肉汁が溢れ出している。とにかく肉好きにはおすすめ。

福岡県新宮町: どーんと3㎏!4種ハンバーグセット【150g×20個】

レンジでできるのありがたい。