MacでLinux Kernelをcloneするといじってないファイルがmodifiedされていると言われる現象
閲覧用にMac上にLinux Kernelをcloneしたところ、いじってないファイルがmodifiedであると言われて何もできなくなる事態が発生した。
具体的には以下のようなエラーメッセージが出力される。
$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: include/uapi/linux/netfilter/xt_CONNMARK.h modified: include/uapi/linux/netfilter/xt_DSCP.h modified: include/uapi/linux/netfilter/xt_MARK.h modified: include/uapi/linux/netfilter/xt_RATEEST.h modified: include/uapi/linux/netfilter/xt_TCPMSS.h modified: include/uapi/linux/netfilter_ipv4/ipt_ECN.h modified: include/uapi/linux/netfilter_ipv4/ipt_TTL.h modified: include/uapi/linux/netfilter_ipv6/ip6t_HL.h modified: net/netfilter/xt_DSCP.c modified: net/netfilter/xt_HL.c modified: net/netfilter/xt_RATEEST.c modified: net/netfilter/xt_TCPMSS.c
検索したところ、以下のようなページが見つかった。
git - Linux Kernel sources modified on OSX right after clone - Stack Overflow
要するにHFS+ではファイル名の大文字と小文字の区別がつかないので、上のファイルは衝突してgitが混乱するというのが原因らしい。
実際に確認してみたところ、確かにinclude/uapi/linux/netfilter/xt_CONNMARK.hとinclude/uapi/linux/netfilter/xt_connmark.hというファイルが見つかった。
解決策は大文字と小文字が区別される専用のディスクイメージを作成し、その中でcloneするのが良いとのこと。ディスクユーティリティを開いて、ファイル→新規イメージ→空のイメージを作成から、フォーマットの欄で大文字/小文字を区別にすればcase-sensitiveなディスクイメージが作成できる。
結構回りくどいような…
回答者も言及しているが、Virtual Box等でVMを立ててLinux環境を作り、ssh越しに閲覧するのが早いと思う。emacs派ならTRAMPを使おう。
カーネルからリンクダウン時のイベントを飛ばす処理を探す
あるインタフェースのリンク状態を確認するために、netlinkソケットを使ってカーネルからメッセージを受信するサンプルがnetlink(7)に載っています。
struct sockaddr_nl sa; memset(&sa, 0, sizeof(sa)); sa.nl_family = AF_NETLINK; sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR; fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); bind(fd, (struct sockaddr *) &sa, sizeof(sa));
このRTMGRP_LINKなパケットがどこから飛んでくるのかを調べたのでメモ。
続きを読む1年生に送るデバッガ(gdb)の使い方(中級編)
前回の記事でコアダンプからセグメンテーション違反の原因を探す方法を書きました。
今回はデバッガからプログラムを実行することで、実行中のプログラムを一時停止したり変数に何が入っているかを確認してみましょう。