exit(2)とpid namespaceめも

プロセスが終了するときにもpid namespaceが関係するので、その辺りのめもです。 流れとしてはこんな感じです。 do_exit()@kernel/exit.c -> exit_notify@kernel/exit.c -> forget_original_parent()@kernel/exit.c -> find_child_reaper()@kernel/exit.c ->…

Net Namespace: copy_net_ns()めも

Net Namespaceのcopy_net_ns()の処理を読みます。カーネルのバージョンはv4.5。 まずはデータ構造で、Net Namespaceを表現するデータ構造はstruct net。定義はinlude/net/net_namespace.hにあります。この構造体にuser_namespace構造体とかns_common構造体み…

lscpuコマンド

util-linuxパッケージにlscpu(1)なんてコマンドがあることを今さら知りました(;・∀・) gitのログから察するに2008年にリリースされたっぽいですね。 で、実際に実行するとこんな感じです。/proc/cpuinfoを見やすくした感じで良いですね。 masami@saga:~$ ls…

perf-reportめも

Linux 4.5からperf reportのソート方針がちょっと変わっているので忘れないようにメモ。 こんな感じでprobeを設定し、 perf probe -a _do_fork こうやって実行する。 perf record -e probe:_do_fork -aR sleep 10 そして、perf reportを使った場合、 perf re…

kallsymsのめも

/proc/kallsymsをスクリプトで読むときにちょっとハマったので。 なにかというと、下の出力で、ext4_file_operationsはext4モジュールに含まれているというのがわかります。で、_do_forkのほうはモジュールにないので3カラム目まで。 masami@saga:~$ grep ex…

bccでuprobes

前回(LinuxのBPFとbccでデバッグする - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ)はbccを使ってkprobeでカーネル内の関数にprobeを設定したので今回はユーザーランドのほうでuprobesを使うメモ。 fork()が呼ばれたときにプロセス名、pid等を表示する。 …

LinuxのBPFとbccでデバッグする

最近公開されたスライドでLinuxのパフォーマンスチューニングとかDTraceで有名なBrendan GreggさんのLinux BPF Superpowersが面白かったのでBPFとbccに手を出してみました。 BPFはLinuxカーネルのパケットフィルタリングの機能で、その名の通りBerkeley Pack…

systemtapでカーネルの関数を呼ぶメモ

systemtapのスクリプトでカーネル関数を呼ぶのはどうやんだっけ?というところのメモです。 c言語の関数を作って、それを呼び出す形で実装しました。systemtapのマニュアル 3 Components of a SystemTap scriptの3.5~3.7にcの関数を組み込む方法の説明があり…

strncpy_from_user()を読んで見る

なんとなくLinuxカーネルのライブラリにあるstrncpy_from_user()を読んでみます。 ファイルはlib/strncpy_from_user.cです。 関数名から何をするかは想像つきますね。関数はこうなってます。 99 long strncpy_from_user(char *dst, const char __user *src, …

IPC名前空間を調べる(2)

IPC名前空間の初期化で、名前空間のリソース初期化をするこれらの関数は特にこれと言った処理はありません。 mq_init_ns() sem_init_ns() msg_init_ns() shm_init_ns() 各リソースがシステムコールが呼ばれた時にどのように使われるのか?というところに関し…

IPC名前空間を調べる(1)

IPC名前空間で使う構造体とか読んでいきます。まずは簡単に全体像を把握するところからです。 まずはipc_namespace構造体。ファイルはinclude/linux/ipc_namespace.hです。 21 struct ipc_namespace { 22 atomic_t count; 23 struct ipc_ids ids[3]; 24 25 i…

create_pid_namespace()の処理を読む。

最近はfork/clone時のプロセス番号の発行あたりを読んできたので、今回はPID名前空間の生成部分を読んでみます。 処理を行うのはcreate_pid_namespace()です。clone(2)の場合、ここに至る流れはこうなっています。 do_fork() -> copy_process() -> copy_name…

fork/clone時に返すpidの設定(2)

前回のfork/clone時に返すpidの設定(1) - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモの続きです。alloc_pid()を見ていきます。 その前に、pid構造体のnumbers変数はサイズ1の配列として宣言されていますが、pidの処理ではindex番号1とかそれ以上の場所にア…

fork/clone時に返すpidの設定(1)

fork/clone時にpidがどのように決まるのか見てみます。見ているのはカーネル v4.1です。今回はどういう流れで処理されているかを見ていきます。 pidの設定は数カ所でやっていて、copy_process()、copy_namespaces()、do_fork()内でcopy_process()をあります…

setnsの実装を読む

カーネル4.3でのsetnsの実装を読みます。 setns()はkernel/nsproxy.cにあり、30行程度の短い関数です。 流れとしてはこのようになります。 移動先の名前空間のfdからns_common構造体を取得 nsproxyの作成 移動先名前空間のinstall()を呼んで名前空間のほうに…

systemtap probe各種めも

systemtapでスクリプトを書くときのめもです。カーネル、ライブラリ、実行ファイルの3パターンで。 tapsetsにある定義済みの関数を使う場合。ここではvm.kmallocとvm.kfreeを使ってます。 #!/usr/bin/env stap probe begin { printf("start¥n") } function p…

Linuxカーネルのデバッグでprintk(9)デバッグを卒業したいっ!

この記事はLinux Advent Calendar 2015の25日目の記事です。 Linuxカーネルのデバッグである意味一番手軽なのがprintk(9)によるデバッグだと思うんですが(ユーザランドのプログラムで言うところのprintf(3)デバッグ)、この場合h速いCPUを積んだマシンなら…

glibcのmalloc(3)とLinuxカーネルのovercommitとOOM

この記事はLinux Advent Calendar 2015の23日目です。 glibcのmalloc(3)とLinuxカーネルのovercommitとOOMの関連でも見てみようと思います。Linuxカーネルのシステムコールにはmalloc(3)的なものはないので、mmap(2)、brk(2)が使われます。 今回知りたかった…

bash-completionでコマンド補完するときにプロ生ちゃんに何か言ってもらう

この記事はプロ生ちゃん Advent Calendar 2015の5日目です。 bashでコマンド補完をするのにbash-completionを使うと便利ですよね。bash-completionはbashのスクリプトで実装できるので、対応されてないものに対して作成したり、自作のコマンド向けに作ったり…

Linux 4.0(x86_64)のメモリレイアウト

この記事はLinux Advent Calendar 2015の2日目の記事です。 今日は復習も兼ねてメモリレイアウトの確認です。 見るのはDocumentation/x86/x86_64/mm.txtです。見ているのは4.0ですが、4.3も同じでした。 で、メモリーマップですが下記のように説明されていま…

Fedora: Anaconda 3分クッキング

この記事はLinux Advent Calendar 2015 - Qiitaの第一日目の記事です。 anacondaをハックする場合、ビルド周りで参考になるのは下記の2ページです。 Anaconda/Building Anaconda/Updates Buildingのページは必要なパッケージのインストールから始まって、rpm…

fedora カーネルパッケージのバージョンの付け方の謎

このタイトルだと謎とは何ぞや?となる人が多いと思います・・・ どういうことかというと、2015/11/12の時点ではカーネル 4.4のマージウィンドウが開いている段階で、カーネルのMakefileに書かれているバージョンは4.3です。 これを書いている時の最新のコミ…

vagrant-libvirtでbase boxの作成めも

Vagrantを使ってて所要により自前でbase boxを作ろとういうことはあったりするわけで、今回はvagrant-libvirtでboxを作る方法のめも。 まずは、普通にLinuxがインストールされた環境を作るところから。ここは普通にvirt-managerで作成。ストレージのファイル…

Fedora 23でFedora Cloudイメージをvagrant-libvirtで動かすメモ

Vagrantでlibvirt使えるならそっちのほうが便利だよなーというところで、まずは軽くお試しを。 Fedoraでlibvirt providerのインストールに関しては最近公開されたFedora Developer PotalのVagrant with libvirt support installationにあるとおりで、dnfコマ…

Linuxのスケジューラのデータ構造めも

Linuxのスケジューラはランキューには赤黒木を使っていて〜というところは見聞きしたことありますが、実際にどんなデータを使っていて、それらの関係は?と思ったので調べてみました。 スケジューラに関連する構造体はこれらのものがあります。 struct sched…

sched_setscheduler(2)の挙動めも

ちょっとsched_setscheduler(2)の動作を調べていたのでそのメモを。 見ているのはlinux kernel 4.2。 sched_setscheduler(2)はkerne/sched/core.cにある。 ここは単なる入り口でpolicyが0以下の場合にエラーを返す程度で、その他の処理はdo_sched_setschedul…

c、golang、ruby、pythonで簡単なサーバを書いて比べてみる

c以外は手軽に書けることは間違いないんだけど、ちょっとやってみますかということで。 サーバの処理としてはtcp port 9999で待ち受けて、クライアントからアクセスがあったら"hello, world"を返すだけのもの。 実装方法は完全に同じじゃなくて、例えばcだと…

第8回 コンテナ型仮想化の情報交換会@東京で発表してきました

2015/09/26に開催された第8回 コンテナ型仮想化の情報交換会@東京で発表してきました。 ct-study.connpass.com 発表資料はこちらです。 Linux Namespaces from Masami Ichikawa www.slideshare.net 名前空間を使うことによるオーバーヘッドはほぼ無いと思い…

kmem_cache_alloc_bulk()を試してみる

lwn.netの2015/09/10の記事でLinuxの4.3にkmem_cache_alloc_bulk()とkmem_cache_free_bulk()のスラブキャッシュをがっつり確保するための関数が入ったと書かれていたので試してみました。 最初のパッチはslab: infrastructure for bulk object allocation an…

PID名前空間で名前空間を普通の時と多段にしたときでgetpid(2)にかかる速度を見てみる

PID名前空間で名前空間をとくに使わない時(CONFIG_PID_NS=yな環境で特に分離させてない時)とPID名前空間の分離を多段でやってみた時で、getpid(2)に影響があるのかどうかというのを見てみました。 まず、getpid(2)の仕組みですが、これは以前書いたCLONE_N…