システムコール

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 する

fedoraでlinux kernelのデバッグ環境


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:1234

1234は、ie-virsh dumpxml で debug port を探します。

    (gdb) b sys_read

して、

    (gdb) c

VNC側から何か入力すると、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.iso

console から 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.cfg

cf 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.sif

singularity の中で

  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 でおこなうこと


Shinji KONO / Thu Jul 28 16:10:04 2022