読者です 読者をやめる 読者になる 読者になる

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…

free(1)、/proc/meminfoとメモリの総容量

言われてみればそれはそうだなな言えるところで、free(1)とか/proc/meminfoにあるMemTotalが物理メモリの総容量ではないよねってのがありますね。 まずmanでfree(1) - Linux manual pageを見ると総容量なのかなと読める訳なんですね。 total Total installed…

samba 4.3.0でsambaサーバの起動に失敗してた

Arch Linuxでsambaを使って単純なファイルサーバにしていて、今日の(ほぼ日課のyaourt -Syuaでアップデートしたところsambaのバージョンが上がり4.3.0になりました。それで、他にもアップデートされたのあるしということで再起動してからsambaサーバにアク…

linux: socketとNet名前空間

LinuxカーネルのNet名前空間の辺りを読んでみます。 まず、抑えておくべきNet名前空間はどんなものかというとこです。ここを抑えておかないと話が進まないですね。 Net名前空間はstruct netです。これは比較的大きめの構造体です。メンバ変数としてipv4、ipv…

「自作エミュレータで学ぶx86アーキテクチャ」のemu2.3をrubyで書いてみる

今日(というか、土曜日)に「自作エミュレータで学ぶx86アーキテクチャ」が届いていたので、とりあえず2.3 初めてのエミュレータのエミュレータをrubyで書いてみた。基本的には書籍のcコードを移植する形で。 gist.github.com 実行しているところがこちら。…

俺得なLinuxの名前空間を調べるツール作成中

他に使う人がいない気もするがなんとなく作っているものがこれ。 masami256/nsinfogithub.com 現状できるのは 個々の名前空間に所属しているプロセス名、PIDなどを表示(-aオプション) あるPIDが所属している名前空間(inode)の表示(-pオプション) 各名前空…

open(2)でO_CREAT or O_TMPFILEを使うときはmodeのセットを忘れずに

Linux Kernelのfauzzingツールとして有名trinityを動かすとすぐにこんなエラーが出て止まりました。 [main] fd[419] = fopen /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-Virtual-2/edid (read-only) flags:0 fcntl_flags:0 *** invalid open cal…

mount namespaceでinit_taskのmnt_nsを設定するところ

Linuxのinit_taskに設定されるmnt_nsはコンパイル時には設定されていなくて実行時に決定されてます。で、それがどこで設定されているのかのメモです。 まず、nsproxy.cでinit_taskはこのように作られていて、mnt_nsはNULLが初期値になっている。 31 struct n…

installkernelのついでに/boot/loader/entries/*.confも追加する

Linuxカーネルを自前でビルドしている場合、grubなら/boot以下にvmlinuzなんかを置いたあとにgrub-mkconfigでgrub.cfgをアップデートすればブートメニューに新しいカーネルが反映されますが、gummiboot/systemd-bootの場合は/boot/loader/entries/*.confにフ…

dnf: distro-syncとupgradeの違いを調べてみる

Fedora 22から公式に採用されたパッケージマネージャのdnfで、distro-syncとupgradeは何が違うのかというのを調べてみました。 まずはお約束通りにmanから。 distro-syncの説明。 Distro-sync command dnf distro-sync [<package-spec>...] As necessary upgrades, downgra</package-spec>…

virshでゲストに割り当てられたIPアドレスの確認

libvirtdな環境で、ゲストに割り当てられたIPアドレスを見るのはどうやんだっけーと思って、virsh helpで調べたのでメモ。 まあ、net系のオプションだよなーと思って見てみたらnet-dhcp-leasesというのがあって、これっぽいよなと試したら正解だった。 使い…

linux: 署名付きカーネルモジュールの署名の付き方

Fedora等、モジュールを署名しているディストリビューションの場合、カーネルモジュールのELFバイナリの最後に署名がついています。これがとんな感じなの?いうところはkernelのDocumentation/module-signing.txtに書かれています。/proc/keysで鍵の確認とか…

namespaces: proc_ns_operations構造体のget()の呼び出し方

各名前空間は/proc//ns以下にファイルとしてエクスポートされていて、nsenterがこの辺を使うわけですが、proc_ns_operations構造体に設定した関数はどのような流れで呼びだされているのかを見てみます。 対象をuts namespaceとし、utsns_get()にWARN_ONを仕…

buddy allocator: compatctionの処理 compaction_suitable()

compaction_suitable()はcompact_zone()の最初に使う関数で、コンパクションしようとしているzoneをコンパクションするかどうか判断する。 compaction_suitable()自体はたいした処理はなく、__compaction_suitable()が実際にチェックをする。 1259 unsigned …

buddy allocatorの__zone_watermark_ok()めも

Linuxのbuddy allocatorでpage数のwatermarkをチェックしているのは__zone_watermark_ok()。そんなわけで、今日はその辺りの動作を見てみる。 __zone_watermark_ok()は他のファイルから直接呼べないので、zone_watermark_ok()を使う。例えば、mm/compaction.…

buddy allocator: compactionのざっくりとした流れ

__alloc_pages_slowpath()でcompactionの処理をする場合のざっくりとした流れをc⌒っ゚д゚)っφ メモメモ... __alloc_pages_slowpath()では__alloc_pages_direct_compact()をこのように呼んでpageの確保を試みる。 2700 /* 2701 * Try direct compaction. The first…

user_ns: task_structからuser_nsの取得めも

誰得なめも。task_structからuser_nsの取得の方法。 名前空間はstruct nsproxyで管理されているけど、user namespaceはstruct credが管理していて、user namespace以外の名前空間はその構造体にuser namespaceへのポインタを持っている。 このポインタがどう…

Linux: inodeからtask_struct構造体を取得

Namespace周りのコードを読んでいたらinodeからtask_struct構造体を取得をしているところがあって、こんなことできるんだ〜などと思ったのでどんな方法で取得するのか見てみます。 使ってた場所はproc_ns_follow_link()とかです。 ↓のように。 37 struct tas…

buddy system: __alloc_pages_slowpath()のざっくりとした流れ。

LinuxのPage Allocatorで __alloc_pages_slowpath()の流れをメモ程度に。 読んでいるカーネルのversionは4.0。 __alloc_pages_nodemask()でget_page_from_freelist()を呼んだ時にpageの確保ができなかった場合に呼ばれるのが __alloc_pages_slowpath()。 get…

aurのパッケージをaur4に移行した

Arch LinuxのAURにPKGBUILDをアップロードしている人には「AUR 4.0.0 migration notification」というメールが届きましたね。aru4になってもパッケージをメンテナンスしたいひとは6月8日〜7月8日での間にgitリポジトリにコミットしてねってということで、早…

Solaris 10が安かったので購入して仮想環境に入れてみた

単なるやってみた系ですm(__)m Twitterで↓を見て、「Solaris 10が108円なら買いだな!土曜日に行ってみて売ってたら買おう!」と思い、実際にアキバパレットタウンに行ったところ売ってたので買ってみました。 「SOLaris ¥108」アキバパレットタウン #akiba…

buddy allocator: __rmqueue_fallback()を調べる

前回の記事では__rmqueue_smallest()を見たので、今回は __rmqueue_fallback()を見ていきます。 この関数の呼び出し元は__rmqueue()で、__rmqueue_smallest()でメモリを確保できなかった場合に実行されます。 では、処理を見ていきましょう。 __rmqueue_fall…

buddy allocator: __rmqueue_smallest()を調べる

前回の「buffered_rmqueue()めも - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ」続きとして、__rmqueue_smallest()を読みます。 これは割と分かりやすい感じです。 では、見ていきます。 関数のプロトタイプはこうなっていて、引数はpageを確保する対象のzo…

firewalld+ipdeny.com+systemdでブラックリストに載ってるIPからの接続を弾く

iptableでもやってたんですが、firewalldに乗り換えたので。 実行するのはこのスクリプトです。何も考えずにファイルにあるものを追加していってますw ChainNameのところは使っているchain名に変えてください。 #!/bin/bash ZONE_FILE_URL="http://www.ipde…

firewalldでzoneを作ってsshのブルートフォースアタック対策を入れる位までのめも

そろそろfirewalldを使ってみようかな〜ということで、yaourt -S firewalldしてインストールして設定してみました。 やったことはzoneを新規に作って、source(192.168.11.0/24)をそこに割り当てて、サービス(sshとか)を許可したりということ。 まずはデフォ…

buffered_rmqueue()めも

今日はLinuxカーネルもくもく会 #12 を利用してbuffered_rmqueue()から読んでく。 buffered_rmqueue() 最初の大きな分岐はページ確保のorderが0(1page)かどうかで処理が変わる まずは1page分の場合から見ていく if文には1pageにlikelyが使われいるのでこっ…

マウント名前空間でちょっとハマっためも

Mount namespaceをちょっと確認って思って、unshareコマンドでマウント名前空間を分離したのにプロセス間でマウント状況が分離されてなくてちょっと調べたという。 アップデート済みのarchとfedora 22で試したんだけど、unshareしたプロセスでmountしたもの…

Raspberry Pi向けのArch Linuxでdocker imageを作った

ベースディストリビューションがRaspberry Pi向けのArch LinuxなDocker imageを作ってDocker Hubに登録しました。 リポジトリはmasami256/arch-raspiです。 Dockerfileとベースになるファイルシステムのビルドスクリプトはgithubのmasami256/arch-raspi-dock…

get_page_from_freelist()の処理

前回は__alloc_pages_nodemask()を見たので、今回はそこから呼ばれ、実際にallocationを行う部分の get_page_from_freelist()を見ていきます。 基本的な流れは、 boolの変数consider_zone_dirtyにalloc_flagsとgfpフラグの値から真偽値を決める ここでgfpフ…

linux: page allocatorの辺りを読んでいこう

Linuxのpage単位のallocatorを理解したいなーというところで、mm/page_alloc.cの __alloc_pages_nodemask()を起点にコードを読み始める。 __alloc_pages_nodemask()はalloc_pages()なんかから呼ばれるところですね。 __alloc_pages_nodemask()の細かいところ…

Selenium/Appium: WD.jsで独自の関数を追加する

WD.jsはSelenium2とAppiumに対応しているnode.js向けのドライバーですが、これって独自の関数を追加できるので、この辺をちゃんと使うと便利だなと気付いたわけです。 WD.jsは使い方としてQ promises + chaining、Pure async等ありますが、ここではQ promise…

2015年5月のYo API事情

久々にYoを使って進化したんだなーと言うところも有るし、そんな変わっていないなーというところもありますね。ということでその辺をつらつらと。 まず、どんなAPIがあるのかというところですが、これはYoのデベロッパー向けドキュメントを見ればバッチリで…