システムコール
Menu既に構築してある debug 用の Fedora 36 VM + Kernel + Kernel source を用いて、Kernel 内部のシステムコール の実装を調べる
ie-virsh で template を確認して差分 vm を作る
% ie-virsh templatesこれで使用可能な template の一覧がでる。これらは、
% ls -l /ie-ryukyu/kvm/images/templatesに実際に置いてある。これの作り方は、下の方に記述されている。
% ie-virsh listで、空いている名前を確認して、
% ie-virsh define -g -t Fedora36-Debug kono-02などで差分 image を作成する。差分イメージはここにある。元のイメージを変更してはならない。差分の大きさを確認する。元のイメージとどれくらいのさがあるか。
ls -lh /ie-ryukyu/kvm/images/rental/kono-0*これを
% ie-virsh start kono-02 ; ie-virsh console kono-02 !!!! 重要 !!!で console に接続する。UEFI (grub) メニューの上から二つめの kernel が debug 用である。
!!!! 重要 !!!それを起動する。
singularity から gdb で接続する
% singularity shell --bind /home/open/Fedora/Fedora35/kernel:/usr/src/kernels/fedora /mnt/ie-virsh/singularity/fedora-debug/fedora-debug.sifとする。この singularity image の構築方法は /mnt/ie-virsh/singularity/fedora-debug/README.md を見よう。
% ie-virsh dumpxml kono-02 | tail <qemu:arg value='tcp::44867'/>で port を確認する。
Singularity> cd /usr/src/kernels/fedora/ Singularity> gdb vmlinux GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2 For help, type "help". Type "apropos word" to search for commands related to "word"... No symbol table is loaded. Use the "file" command. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] Reading symbols from vmlinux... (gdb) target rmote :44867 Undefined target command: "rmote :44867". Try "help target". (gdb) target remote :44867 Remote debugging using :44867これで gdb が接続できた。gdb の中で
add-auto-load-safe-path /usr/src/kernels/fedora x-symbolsがいるかも。
終わったら、singuluraity を抜けて、ie-virsh shutdown するのを忘れないこと。
システムコールテーブル
arch x86_64 に関して以下のことを調べるがカーネル内部でシステムコール番号から関数ポインタに変換するテーブル。
select の番号はいくつか?
ファイルディスクリプタ
read が参照するファイルディスクリプタのカーネル内部での構造
fs/read_write.c を読む SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) struct の名称とソースファイル名を示せ。
ファイルディスクリプタの排他制御
ファイルディスクリプタ参照する際の排他制御はCレベルではどこでおこなわれているか。
hint fs/file.c
プロセスとスレッド
プロセスとスレッドが kernel の中でどのような構造を持っているかを調べる。
hint task_struct
VirtualBox や VMWare Fusion を使って、Linux kernel を gdb/lldb に接続する (option)
kernel を debug 用に config したものを使用する VM image を作成する
VM を定義している xml を debug 用に調整する
source と kernel を適切な場所に置き、kernel gdb を VM に接続する
system call table に break point をかけて、そこから trace する
OS の授業で使う kernel debug について
virsh 上にある debug 対象の VM は下記になります。
/mnt/whisky/os/teachers/kono/02.qcow2がdebug対象になります。Fedora 24 です。password resetしないとloginできませんが、loginしなくても良いです。
/net/open/Linux/Kernel/fedora26にkernel sourceが置いてあります。
ie-virsh define --gdb kono-01としてdebug 用にvmを定義します。この時にVNC passwordが表示されるので、それを覚えておきます。
指定された VM image のpathに 02.qcow2 をsymbolic linkします。
ln -s /mnt/ie-virsh/teacher/kono/kono-01.qcow2 /mnt/ie-virsh/student/e21/e2157xx/e2157xx-01.qcow2定義したVmを
ie-virsh start 01で起動します。この時、VNCで接続して Boot時に linux-4.8.12 を選択します。
VNCは、
ie-virsh vncdisplay 01で画面番号を確認し、5900 + 画面番号のportでアクセスします。この時に、define 時に出たpasswordを使って接続します。dumpxml では password は見れません。(何故かそうなっている)
手元から tunnel で server に接続します。
ssh -L 10024:localhost:5921 -N amane.ie.u-ryukyu.ac.jpホスト側で、
cd /net/open/Linux/Kernel/fedora26 gdb vmlinuxとし、
(gdb) target remote localhost:12341234は、ie-virsh dumpxml で debug port を探します。
(gdb) b sys_readして、
(gdb) cVNC側から何か入力すると、sys_read で停まるはずです。
Fedora 上で、kernel source を install する。
以下を参考にすると良いらしいです。http://fedoraproject.org/wiki/Docs/CustomKernel
4.4 を使うこと。kernel.org から、取ってくる。
運が良ければ、先輩たちが既に用意してくれているはず。
server 上 の
/home/open/Fedoraにあるかも!
kernel を compile する
kernel を fedora 上で gdb 用に作成する
sudo dnf install ncurses-devel make menuconfig make >& ers & disown %m exitなんですが、ansible file が用意されてます。
http://www.cr.ie.u-ryukyu.ac.jp/hg/Ansible/fedora_kernel_build/
Server上のKVMからの Fedoraのinstall
空のイメージを作成する
qemu-img create -f qcow2 /mnt/ie-virsh/teacher/kono/kono-03.qcow2 30G
Server 上で iso image から Fedora を install する
起動し、iso image を接続する
ie-virsh define 03 ie-virsh start 03 ie-virsh attach-disk 03 /home/open/Fedora/Fedora-Server-dvd-x86_64-36_Beta-1.4.isoconsole から UEFI shell 経由で DVD boot する
ie-virsh console 03トンネルしてから
ssh -L 10024:localhost:5900 -N brown再度、start して VNCで接続する( brew install vnc を使う ( macOSの go to からの vnc: では使えない
VNCで(ssh tunnel 経由)接続し、 install する。!!! 安易なパスワードをつけないこと !!!
メディアを外して reboot
ie-virsh change-media 03 -- --eject ie-virsh start 03
Akatsuki への address 登録
Akatsuki に mac address を登録して、再起動すると DNS などが設定されるssh-copy-id してpassword 抜きで sshできるようにする
tty console を有効にする
console へ login するためには設定が必要。Fedora 側の /etc/default/grub に以下を付け加える。(あるいは /boot/grub2/grub.conf の先頭に)
nokaslr をいれないと addrss randamization がかかってしまう
GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,115200n8' GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="nokaslr serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"これからuefi bootのgrub.cfgを生成する。
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfgcf https://linuxhint.com/grub2_mkconfig_tutorial/
file system の拡張
kernel compile するには 30G 必要。だが、Fedroa は defaultで 10GB 固定で lvm を作ってしまうなので、これを拡張する必要がある
拡張手順は
qemu-img resize /mnt/whisky/os/teachers/kono/02.qcow2 +20G fdisk remove last partion create new linux-lvm on full size pvresize /dev/vda3 lvresize -L +20G --resizefs /dev/mapper/fedora_fedora-root xfs_growfs /dev/mapper/fedora_fedora-root
これで
ansible pingできるようにすると、kennel build ができる
cf http://www.cr.ie.u-ryukyu.ac.jp/hg/Ansible/fedora_kernel_build/
kernel build が失敗した時
手動で patch をあてて、ansible の script を見て build すのが簡単
build directory を Ceph 上におく
rsync -av root@fedora-debug.cr.ie.u-ryukyu.ac.jp/usr/src/kernels/fedora
debug 方法
amane:/ie-ryukyu/singularity/fedora-debug singularity build --fakeroot fedora-debug.sif fedora-debug.defを使う。この sif の中から gdb で ie-virsh で動いてる debug buildした kernel に接続する
ie-virsh を debug mode で起動
ie-virsh define --gdb 01この時に debug port を覚えておく
ie-virsh start 01 ; ie-virsh console 01ここで、二つめの debug 用の kernel を選択して boot すること
singularity shell --bind /home/open/Fedora/Fedora35/kernel:/usr/src/kernels/fedora /ie-ryukyu/singularity/fedora-debug/fedora-debug.sifsingularity の中で
cd /usr/src/kernels/fedora gdb vmlinuxそして、gdb の中で
taget rmote :3557とする。(忘れたときは ie-virsh dumpxml 01 で確認できる
templateの場所に、これをコピーする
rsync -av /mnt/ie-virsh/teacher/kono/kono-01.qcow2 /ie-ryukyu/kvm/images/templates/template-Fedora36-Debug.qcow2
root でおこなうこと