前提
- 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