git log -L 4,11:.screenrc
シリアルコンソールで、ターミナルサイズを変更する方法
シリアルコンソールを使うとデフォルトでは、ターミナルサイズが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)次のように鍵をダウンロードして、ホスト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
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タグ) |
| 2 | Ethernet type/size. IPv4:0x0800, IPv6:0x86dd |
| - | ペイロード(IPなど) |
| 4 | FCS (Frame Check Sequence; CRC) |
IPv4
ヘッダサイズ: 20B (拡張情報を除く)| サイズ (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] | 拡張情報 |
| - | データ |
UDP
ヘッダサイズ: 8B| サイズ (B) | 説明 |
|---|---|
| 2 | 送信元ポート |
| 2 | 送信先ポート |
| 2 | データ長 |
| 2 | チェックサム |
| - | ペイロード(IPなど) |
TCP
ヘッダサイズ: 20B| サイズ (B) | 説明 |
|---|---|
| 2 | 送信元ポート |
| 2 | 送信先ポート |
| 4 | シーケンス番号 |
| 4 | 確認応答番号 |
| 2 | ヘッダ長(MSB 4bit)[32bit単位]、予約(3bit)、フラグ(9bit) |
| 2 | Windowサイズ |
| 2 | チェックサム |
| 2 | 緊急ポインタ |
| [4-40] | オプション |
| - | ペイロード |
QEMUでLinuxカーネルをGDBでデバッグする
QEMUの起動
以下の2つのオプションを使う| オプション | 説明 |
|---|---|
| -s | TCP 1234番でGDBのリモートコクションをオープンします |
| -S | GDBにアタッチされるまでゲストの実行を待機します。カーネルの起動後にアタッチしても問題ない場合、不要です。 |
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
GDBの起動
デバッグ情報付きのvmlinuxを引数にしてGDBを起動するgdb /usr/lib/debug/vmlinux-5.10.0-22-amd64GDB起動後、以下のコマンドを実行する
(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 *)¤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領域へのポインタが格納されている。
参考
登録:
投稿 (Atom)