memo.log

技術情報の雑なメモ

カーネルをコンパイルして、1行だけデバッグログを追加する最低限の手順

前提

  • Amazon Linux2 ( amzn2-ami-hvm-2.0.20210126.0-x86_64-gp2 )
  • アップデート前のカーネルバージョン
  • 4.14.214
  • アップデート後のカーネルバージョン
    • 4.19.172

手順

必要なパッケージのインストール

# yum groupinstall "Development Tools"
# yum install ncurses ncurses-devel
# yum -y install openssl-devel

資材の準備

# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.172.tar.xz
# xz -dv linux-4.19.172.tar.xz
# tar xvf linux-4.19.172.tar
# cd linux-4.19.172/

1行だけデバッグログを追加してみる

# vim net/packet/af_packet.c # 
static int 
packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
{
+       pr_warn("my setsocopt\n");
        struct sock *sk = sock->sk;
        struct packet_sock *po = pkt_sk(sk);

ビルド

# cp /boot/config-4.14.214-160.339.amzn2.x86_64 .config
# make syncconfig
# make
# make modules_install
# make install
# reboot

使用するカーネルバージョンの指定

# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg # リストの中から使用するバージョンのカーネルの番号を確認する
# grub2-set-default 0 # 0 の場合
# grub2-editenv list
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot

動作確認

カーネルバージョンの確認

# uname -r # 4.19 が表示されればOK

デバッグログの確認

以下のファイルを準備

soc_test.c

#include <stdio.h>
#include <sys/socket.h> // PACKET_ADD_MEMBERSHIP
#include <net/ethernet.h>
#include <netinet/in.h> // htons
#include <linux/if_packet.h>

int main(void)
{
  int sock;
  sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

  struct packet_mreq mreq;
  mreq.mr_ifindex = 2; // eth0
  mreq.mr_type = PACKET_MR_PROMISC; // 1
  mreq.mr_alen = 0;
  mreq.mr_address[0] ='\0';

  setsockopt(sock, 263, 1, (void *)&mreq, sizeof(mreq));

  return 0;
}

実行・確認

# ./soc_test
# dmesg # 追加したデバッグログ (my setsocopt)が表示されればOK 

参考

qiita.com