ラベル Linuxカーネル の投稿を表示しています。 すべての投稿を表示
ラベル Linuxカーネル の投稿を表示しています。 すべての投稿を表示

2020/11/01

virt-managerでインストールしたPlamo Linuxのカーネルデバッグ

自分が忘れないようにメモ程度です。

以下のサイトを参考にしました。


まずはvirt-managerでゲストOSとしてPlamo Linuxをインストールします。

ゲストのカーネルをKGDB関連を有効にしたものに変更します。
私は下記のようにしました。

# CONFIG_RANDOMIZE_BASE is not set

CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
# CONFIG_KGDB_TESTS_ON_BOOT is not set
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_KDB=y
CONFIG_KDB_DEFAULT_ENABLE=0x1
# CONFIG_KDB_KEYBOARD is not set
CONFIG_KDB_CONTINUE_CATASTROPHIC=0


ホストの側で下記のコマンドを実行します。

$ sudo virsh edit ゲストの名前

ドメインタグの
<domain type='kvm'>
の部分を下記のように変更します。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <qemu:commandline>
    <qemu:arg value='-s'/>
  </qemu:commandline>

Qemuの実行時に-sオプションを追加しています。

-sオプションは-gdb tcp::1234と等価とのことです。
私はcjk_ttyパッチが当たっているカーネル5.4.39とパッチが当たっていない5.9.1を同時に動かしたかったので、片方を下記のように記述しました。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0>
  <qemu:commandline>
    <qemu:arg value='-gdb'/>
    <qemu:arg value='tcp::4321'/>
  </qemu:commandline>



ゲストのPlamo Linuxを再起動します。


ホスト側でgdbを立ち上げて下記のようにします。

takahiro@plamovaio:~/work/src/kernel/qemu/5.9.1/linux-5.9.1$ gdb vmlinux
GNU gdb (GDB) 8.0
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from vmlinux...done.
warning: File "/home/takahiro/work/src/kernel/qemu/5.9.1/linux-5.9.1/scripts/gdb/vmlinux-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add
        add-auto-load-safe-path /home/takahiro/work/src/kernel/qemu/5.9.1/linux-5.9.1/scripts/gdb/vmlinux-gdb.py
line to your configuration file "/home/takahiro/.gdbinit".
To completely disable this security protection add
        set auto-load safe-path /
line to your configuration file "/home/takahiro/.gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:
        info "(gdb)Auto-loading safe path"
(gdb) target remote :1234
Remote debugging using :1234
0xffffffff81a3c8be in native_safe_halt () at ./arch/x86/include/asm/irqflags.h:60
60              asm volatile("sti; hlt": : :"memory");


試しにブレークポイントを貼ってみます。


(gdb) break do_con_write
Breakpoint 1 at 0xffffffff8168f1f0: file drivers/tty/vt/vt.c, line 2850.
(gdb) c
Continuing.

Breakpoint 1, do_con_write (tty=0xffff8880748ef800, buf=0xffff88807c073c00 "aogin: velop",
    count=1) at drivers/tty/vt/vt.c:2850
2850    {


do_con_write関数にブレークポイントを貼ったところ、文字入力時にブレークポイントで停止しました。

2016/12/26

Linux 4.10.0-rc1でGPD WINのXがintelドライバで起動し画面も回転できた

Linuxカーネル 4.10.0-rc1でGPD WINのLinuxでXがintelドライバで起動し画面も回転できました。

dmesgでエラーが出ていますが、特に問題なく動いているように思います。

[ 1185.682005] [drm:intel_pipe_update_end [i915]] *ERROR* Atomic update failure on pipe B (start=9392 end=9393) time 8 us, min 1272, max 1279, scanline start 1280, end 1281

dmesg
Xorg.0.log

2013/05/12

「Planet CCRMA at Home」のリアルタイムカーネル

先日、VortexBox 2.2のカーネルにCONFIG_PREEMPT_RTのパッチを当てて再構築しました。
VortexBoxのカーネル再構築

その他、VortexBoxのベースであるFedoraのオーディオ関連を強化する「Planet CCRMA at Home」というプロジェクトがあるらしく、そちらでもパッチ適用済みのカーネルを配布していました。

ただし私が確認したところ少し古いみたいです。

・VortexBoxのデフォルトカーネル(アップデート済み)
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.6.11-4.fc16.i686.PAE #1 SMP Tue Jan 8 21:18:14 UTC 2013 i686 i686 i386 GNU/Linux


・Planet CCRMA at Homeで配布しているリアルタイムカーネル
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.0.17-1.rt33.1.fc16.ccrma.i686.rt #1 SMP PREEMPT RT Sat Jan 21 11:15:48 PST 2012 i686 i686 i386 GNU/Linux



普段使用しているマシンで「Planet CCRMA at Home」のカーネルを試してみました。
BDP-105のUSBに接続してですが、音は特に問題なく出ました。
CD入れたらリッピングも始まりました。

少し試した限りでは大丈夫そうです。

リアルタイムカーネルインストール時にデフォルトカーネルを消さないように注意すれば元に戻すことも出来ますし、ちょっと試す分には良いかと思います。


以下試しにインストールした際の手順です。

最悪起動しなくなることも考えられるので自己責任でお願いします。


・「Planet CCRMA at Home」配布アプリをインストールできるようにする
[vortexbox.localdomain ~]# sudo yum localinstall http://ccrma.stanford.edu/planetccrma/mirror/fedora/linux/planetccrma/16/i386/planetccrma-repo-1.1-3.fc16.ccrma.noarch.rpm

〜 省略 〜

合計容量: 20 k
インストール済み容量: 20 k
これでいいですか? [y/N]y

〜 省略 〜

インストール:
planetccrma-repo.noarch 0:1.1-3.fc16.ccrma

完了しました!


・リアルタイムカーネルをインストール
[vortexbox.localdomain ~]# sudo yum install kernel-rt

〜 省略 〜

総ダウンロード容量: 23 M
インストール済み容量: 86 M
これでいいですか? [y/N]y

〜 省略 〜

インストール:
kernel-rt.i686 0:3.0.17-1.rt33.1.fc16.ccrma

完了しました!


・一応デフォルトカーネルが消えていないことを確認。
[vortexbox.localdomain ~]# yum list installed|grep kernel
kernel-PAE.i686 3.6.5-2.fc16 @anaconda-0/1
kernel-PAE.i686 3.6.11-4.fc16 @updates
kernel-headers.i686 3.6.11-4.fc16 @updates
kernel-rt.i686 3.0.17-1.rt33.1.fc16.ccrma @planetcore


・GRUBのエントリも消えていないことを確認
[vortexbox.localdomain ~]# sudo less /etc/grub2.cfg

・再起動
[vortexbox.localdomain ~]# sudo reboot

・GRUBの選択画面中の一番上がリアルタイムカーネル

2013/05/08

VortexBoxのカーネル再構築

VortexBox 2.2のカーネルにCONFIG_PREEMPT_RTのパッチを当てる等して、カーネルの性能アップを狙います。

カーネルの再構築はベースになっているFedoraの流儀に従いました。
Building a custom kernel


2013年5月8日の時点での方針は以下の通りです。
  1. Processor familyにIntel Atomを指定
  2. Preemption ModelにFully Preemptible Kernel (RT)を指定
  3. Kernel hackingの項目は可能な限り組み込まない

再構築後のカーネルが動かなくなる可能性は大いにあります。
私は今回、カーネルパニックで起動しないのを1回、起動してもディレクトリ構造を全く読み込めないのを1回作りました。

出来上がったカーネルでMPDを使用しての音楽再生の感想ですが…、曲によって差がありますが音が滑らかになったかなぁという気がします。

2.8MHzのDSDを176.4kHz/24bitのflacファイルに変換したものを再生した際に特に顕著に感じました。

他にはクリアになったのと音が広がるような印象を持った曲もありました。

つたない表現ですいません。


以下の作業は一般ユーザで行い、root権限が必要な場合はsudoコマンドを使用しております。


・デフォルト状態の確認
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.6.11-4.fc16.i686.PAE #1 SMP Tue Jan 8 21:18:14 UTC 2013 i686 i686 i386 GNU/Linux


・RPMパッケージの作成に必要なツールインストールする
[vortexbox.localdomain ~]# sudo yum install rpmdevtools yum-utils

〜 省略 〜

総ダウンロード容量: 225 k
インストール済み容量: 347 k
これでいいですか? [y/N]y

〜 省略 〜

完了しました!


・RPMのビルド環境を作る
[vortexbox.localdomain ~]# rpmdev-setuptree

・カーネルソースパッケージをダウンロード
[vortexbox.localdomain ~]# yumdownloader --source kernel

〜 省略 〜

kernel-3.6.11-4.fc16.src.rpm | 66 MB 00:29


・カーネルソースパッケージに必要なパッケージをインストールする
[vortexbox.localdomain ~]# sudo yum-builddep kernel-3.6.11-4.fc16.src.rpm

〜 省略 〜

総ダウンロード容量: 8.2 M
インストール済み容量: 15 M
これでいいですか? [y/N]y

〜 省略 〜

完了しました!


・カーネルソースパッケージを一般ユーザの~/rpmbuild/以下にインストールする
警告が出ますが無視して良いようです。
[vortexbox.localdomain ~]# rpm -Uvh kernel-3.6.11-4.fc16.src.rpm

〜 省略 〜

警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します


・カーネルソースツリーを準備する
[vortexbox.localdomain ~]# cd ~/rpmbuild/SPECS/
[vortexbox.localdomain SPECS]# rpmbuild -bp --target=$(uname -m) kernel.spec

〜 省略 〜

+ cd ..
+ exit 0


・環境変数を設定する
[vortexbox.localdomain SPECS]# export arch=i686
[vortexbox.localdomain SPECS]# export ver=3.6
[vortexbox.localdomain SPECS]# export subver=11-4
[vortexbox.localdomain SPECS]# export fedver=fc16


・CONFIG_PREEMPT_RT当てた後のconfigファイルを作成する環境を作る
[vortexbox.localdomain SPECS]# cp -r ~/rpmbuild/BUILD/kernel-$ver.$fedver ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig
[vortexbox.localdomain SPECS]# cp -al ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new


・CONFIG_PREEMPT_RTを準備する
CONFIG_PREEMPT_RTからパッチを入手します。
新しいパッチがリリースされると古いものはフォルダから移動されるようなので、コマンド例のURLは無効になっている可能性があります。
CONFIG_PREEMPT_RTからカーネルバージョンに合った最新版を入手してください。
[vortexbox.localdomain SPECS]# cd ../SOURCES/
[vortexbox.localdomain SOURCES]# wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.6/patch-3.6.11.2-rt34-rc1.patch.gz

〜 省略 〜

013-05-07 09:06:42 (248 KB/s) - `patch-3.6.11.2-rt34-rc1.patch.gz' へ保存完了 [167521/167521]

[vortexbox.localdomain SOURCES]# gzip -d patch-3.6.11.2-rt34-rc1.patch.gz


・config作成用のソースツリーにCONFIG_PREEMPT_RTを当てる
[vortexbox.localdomain SOURCES]# cd ../BUILD/kernel-3.6.fc16.new/linux-3.6.i686/
[vortexbox.localdomain linux-3.6.i686]# patch -p1 < ../../../SOURCES/patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜

patching file net/packet/af_packet.c
patching file net/rds/ib_rdma.c
patching file scripts/mkcompile_h


・ベースとなるconfigファイルを準備する
[vortexbox.localdomain linux-3.6.i686]# cp configs/kernel-3.6.11-i686-PAE.config .config

・make menuconfigを実行するために必要なncurses-develをインストールする
[vortexbox.localdomain linux-3.6.i686]# sudo yum install ncurses-devel

〜 省略 〜

総ダウンロード容量: 700 k
インストール済み容量: 700 k
これでいいですか? [y/N]y


・make menuconfigを実行してカーネルに組み込む機能を選択する
[vortexbox.localdomain linux-3.6.i686]# make menuconfig
menuconfig トップ画面

Processor type and features
→ Processor family を Intel Atom に設定

Processor type and features
→ Preemption Model を Fully Preemptible Kernel (RT) に設定

Kernel hacking の項目を可能な限り外す

・configファイルの先頭に # i386 を記述
[vortexbox.localdomain linux-3.6.i686]# vi .config
[vortexbox.localdomain linux-3.6.i686]# head -n1 .config
# i386


・作成したconfigファイルをコピーする
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic

・32-bit x86 カーネルの場合は下記もコピーする
コピーしないと後で行うrpmbuildの途中で止まってしまいます。
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-i686-PAE
[vortexbox.localdomain linux-3.6.i686]# cp .config ~/rpmbuild/SOURCES/config-x86-32-generic


・SPECファイルを修正する
左端の番号は行番号です。
状況により異なる番号になるかもしれません。
色を変えてある部分が修正した箇所です。
[vortexbox.localdomain linux-3.6.i686]# cd ~/rpmbuild/SPECS
[vortexbox.localdomain SPECS]# vi kernel.spec

〜 省略 〜

26 # % define buildid .local
27 %define buildid .hanagurort3

〜 省略 〜

739 #rhbz 890547
740 Patch21240: ACPI-do-not-use-Lid-and-Sleep-button-for-S5-wakeup.patch
741
742 Patch99999: patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜

1395 #rhbz 890547
1396 ApplyPatch ACPI-do-not-use-Lid-and-Sleep-button-for-S5-wakeup.patch
1397
1398 ApplyPatch patch-3.6.11.2-rt34-rc1.patch

〜 省略 〜


・カーネルをビルドする
--without pae と --without debug を指定して私の環境には必要ないものはビルドしません。
全部ビルドしたら15時間くらいかかりました。
[vortexbox.localdomain SPECS]# rpmbuild -bb --without pae --without debug --target=`uname -m` kernel.spec

〜 省略 〜

書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-headers-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-debuginfo-common-i686-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-libs-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-libs-devel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-tools-debuginfo-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-devel-3.6.11-4.hanagurort3.fc16.i686.rpm
書き込み完了: /home/hanaguro/rpmbuild/RPMS/i686/kernel-debuginfo-3.6.11-4.hanagurort3.fc16.i686.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.mUMZZ7
+ umask 022
+ cd /home/hanaguro/rpmbuild/BUILD
+ cd kernel-3.6.fc16
+ rm -rf /home/hanaguro/rpmbuild/BUILDROOT/kernel-3.6.11-4.hanagurort3.fc16.i386
+ exit 0


・カーネルをインストールします
とりあえずカーネルとモジュールだけインストールして、問題なく起動することを確認後にインストールします。

-Uや--upgradeオプションは使用してはいけないとドキュメントにあります。
おそらく正常に動いているカーネルが削除されてしまい、新しくインストールしたカーネルが動かなかった場合にどうしようもなくなる可能性があるからかと思います。
 [vortexbox.localdomain SPECS]# cd ../RPMS/i686/
[vortexbox.localdomain i686]# sudo rpm -ivh --force kernel-3.6.11-4.hanagurort3.fc16.i686.rpm
準備しています... ########################################### [100%]
1:kernel ########################################### [100%]


・GRUBの設定ファイルを修正してインストールしたカーネルの起動オプションにmaxcpus=1とlapicを追加します
[vortexbox.localdomain i686]# sudo vi/etc/grub2.cfg

〜 省略 〜

menuentry 'Fedora (3.6.11-4.hanagurort3.fc16.i686)' --class vortexbox --class gnu-linux --class gnu --class os {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='(hd0,gpt2)'
search --no-floppy --fs-uuid --set=root 764f5a38-5c5b-4330-b689-fa21c0cbb68c
echo 'Loading Fedora (3.6.11-4.hanagurort3.fc16.i686)'
linux /vmlinuz-3.6.11-4.hanagurort3.fc16.i686 root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0 rd.lvm.lv=VolGroup/lv_swap KEYTABLE=jp106 quiet SYSFONT=latarcyrheb-sun16 rhgb rd.lvm.lv=VolGroup/lv_root rd.luks=0 LANG=en_US.UTF-8 maxcpus=1 lapic
echo 'Loading initial ramdisk ...'
initrd /initramfs-3.6.11-4.hanagurort3.fc16.i686.img
}

〜 省略 〜



ここで再起動したところ以下のようなエラーメッセージが出てモジュールを読み込むことが出来ませんでした。

modprobe: FATAL: Could not load
/lib/modules/3.6.11-4.hanagurort3.fc16.i686-rt34-rc1/modules.dep: No such file or directory


そこでシンボリックリンクを作成して誤魔化しました。
[vortexbox.localdomain ~]# cd /lib/modules
[vortexbox.localdomain modules]# sudo ln -s 3.6.11-4.hanagurort3.fc16.i686 3.6.11-4.hanagurort3.fc16.i686-rt34-rc1


新しくインストールしたカーネルで起動した際の情報です。
[vortexbox.localdomain ~]# uname -a
Linux vortexbox.localdomain 3.6.11-4.hanagurort3.fc16.i686-rt34-rc1 #1 SMP PREEMPT RT Wed May 8 03:45:02 JST 2013 i686 i686 i386 GNU/Linux