カーネル関連tips
カーネルバージョン変更
変更可能なバージョン確認
$ sudo apt-cache search linux-image
上で確認した中から変更したいバージョンを指定
$ sudo apt install [linux-images-***]
起動時にカーネルモジュールがロードされるようにする
カーネルモジュールの正式な置き場?にモジュールをおく
$ sudo cp [your module] /lib/modules/$(uname -r)/kernel/drivers/
依存関係更新
$ sudo depmod -ae
モジュール名をmodules.confに書き込み
$ sudo vim /etc/modules-load.d/modules.conf
デフォルトでロードされるモジュールをロードされなくする
↑と合わせてあとでちゃんとここら辺確認したい.
$ sudo vim /etc/modprobe.d/blacklist.comf
+ blacklist [mod name]
$ sudo update-initramfs -u
$ sudo reboot
grubで起動時に選べるカーネルの種類を見る
※ あとの章で述べているが,grubby でやれという話がある.
$ sudo grep menuentry /boot/grub/grub.cfg
...
menuentry 'Ubuntu, with Linux 5.0.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-25-generic-advanced-e99082e4-8470-4019-9dcc-4535f97283ac' {
menuentry 'Ubuntu, with Linux 5.0.0-25-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-25-generic-recovery-e99082e4-8470-4019-9dcc-4535f97283ac' {
...
ちなみにlinux-imageをinstallしたらこれ増える
標準で起動するカーネルを指定
※ あとの章で述べているが,grubby でやれという話がある.
$ sudo vim /etc/default/grub
#indexで指定する
GRUB_DEFAULT=0
#menuの名前で指定する
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.0.0-25-generic'
メインメニュー>サブメニュー とかって表記したらいいらしいんだけど,正直よくわからねえ http://syuu1228.hatenablog.com/entry/20130120/1358690996
grubby での操作
ちょっとしたカーネル関連の設定変更は grubby でやれという話がさっきから出ている.
//! 起動できるカーネルの種類の確認
$ sudo grubby --info=ALL
//! デフォルトで起動するカーネルの確認
$ sudo grubby --default-kernel
$ sudo grubby --default-index
//!
$ sudo grubby --set-default
$ sudo grubby --set-default-index=[n]
他にもいろいろありそうだがとりあえずで.
dbgsymパッケージリポジトリ導入
$ sudo apt install gnupg
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622 #11371番ポートがデフォルトだけど↓
or
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C8CAB6595FDFF622 #fwかまされてたりするとき
もしくは
$ wget -O - http://ddebs.ubuntu.com/dbgsym-release-key.asc | sudo apt-key add -
$ codename=$(lsb_release -cs)
$ sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
#deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
EOF
$ sudo apt update
ちなみに具体的にはここ http://ddebs.ubuntu.com/pool/main/l/linux/ 迷ったら直に持ってきちゃえばいい
sudo dpkg -i [debian package]
カーネル再構築
カーネルのソースをダウンロードして展開する. 他のバージョンは適当に探せhttps://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ ↑ なんか過去の僕は mirror.kernel.org から探せといっているようだが,普通に https://www.kernel.org/ からでいいよね.
$ mkdir kernel && cd $_
$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.15.1.tar.xz
$ tar -xvJf linux-4.15.1.tar.xz -C /usr/src/kernels //! カーネルとディストリ基本ぽいののソースは /usr/src 配下においたほうが良いぞという話.
ビルドする
$ cd linux-4.15.1/
$ make clean && make mrproper #色々cleanするみたいな mrproperだけでいいって聞いたこともある
# とりあえず既存の.configを持ってくる系のmakeターゲットいくつか並べておく
$ make localmodconfig #既存の.configのうち
$ make oldconfig
# その後の設定 TUI的な感じで設定ができそう
$ make menuconfig
# その他の設定のやり方? ここら辺ncursesが必要だったりしそう
$ make menuconfig # ncurses コマンドラインインターフェイス
$ make nconfig # コマンドラインの新しい ncurses インターフェイス
$ make xconfig # ユーザーフレンドリーなグラフィカルインターフェイス packagekit-qt4パッケージ必要? 簡単で初心者向けらしい
$ make gconfig # GTK+ を使用する
$ make defconfig # default らしい.わかんなかったら変にいじるよりこれしたほうがいいみたいだけど意外に no change だったりもしたけど.
# いるっぽかったやつ 他もあるかも信ないけどぐぐりゃだいたいでる
$ sudo apt install libssl-dev bc libelf-dev(make install の時)
$ make
# モジュールをビルド & インストール (/lib/modules/kernel version>-<config local version> 配下)
$ sudo make modules_install
# 下のコマンドしたら,Image のコピー・initramfs の作成配置・systemtap ファイルの配置などなどよしなにやってくれます
$ sudo make install
//!!!! 以下は過去の文章などちょっと memo 的に残しておく
//!!!! initramfs 作成と systemtap 周りについてはそのうちちゃんとした文章で書きたい.
# /boot にカーネルをコピー
$ sudo cp -v /arch/x86_64/boot/bzImage /boot/vmlinuz-4.15.1
# 初期RAMディスク(initrd)を作成 ubuntuだとinitramfs?
これ正直よくわからない.
archだとmkinitcpioってコマンド叩いてるけどubuntuにはなくて,他のコマンド(initramfs的な感じのネーミングのがいくつか)
あったりするんだけどマジでよくわからなくてわからない.でよくわからなくてわからない
この後適当に起動するカーネルを指定したりして 標準で起動するカーネルを指定 再起動するとビルドしたカーネルで動いてます.
便利なカーネルコンフィグ
起動中に /proc/config.gz でカーネルコンフィグを確認できるようにする.
$ grep IKCONFIG .config
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
menuconfigだと
General setup --->
<*> Kernel .config support
[*] Enable access to .config through /proc/config.gz
こんなことしなくても/boot/config-`uname -r`とかで見れるんじゃね?
カーネルブートオプション
ブートオプションという呼び方があってるのかわからないんだけど,/proc/cmdline で確認できるやつ.
$ cat /proc/cdmline
BOOT_IMAGE=/boot/vmlinuz-4.15.0-101-generic root=UUID=f1f76259-f300-4ddf-9e64-4d770bf4b031 ro default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=1-21,23-43,45-65,67-87 kgdboc=ttyS0,115200 console=ttyS0,115200
設定
※grubの場合は/etc/grub/grub.conf を編集する
grub2の場合
$ vim /etc/default/grub
$ sudo grub-mkconfig
or
$ sudo grub2-mkconfig
or
$ uodate-grub
or
$ update-grub2
これによって /etc/grub/grub.cfg が自動生成される.
参考
ソースコード: https://www.kernel.org/
コードリーディング: https://elixir.bootlin.com/linux/latest/source
linux kernel の make target: https://qiita.com/satoru_takeuchi/items/b372303f62b7ca8b128c