2018年6月アーカイブ

Linux雑多メモ(2018/07/22)

● TZ
glibcでは、TZ環境変数は、
- なしだと"/etc/localtime"を指定したとみなされ、このファイルを探しに行く
- 空(==""を指定した)だと、"Universal"を指定したとみなされ、GMT+0に動く
となる。つまり、設定しない状態はパフォーマンス的によくない。もちろん、タイムゾーンをライブに変更しうる環境ならば、適切に設定すべき。
なお、login shellは、適切に処理をした結果として、TZ環境変数を上書きする?(詳細未確認)

● sparseなcore dump
「仮想はあるけど物理がまだない」アドレスの領域は、core dumpファイルを作るときはsparse(hole)な状態で作られる。なので、/proc/sys/kernel/core_patternに、sparseに非対応のファイルシステムだったりpipeだったりを指定するときは注意が必要。特に、sparseで吐かせたあとそのファイルを不用意にreadすると、(ext4の場合)sparseな部分もページキャッシュにのってしまうので、メモリの無駄遣いが起こる。(ext4_zero_partial_blocks()がext4_block_zero_page_range()を呼ぶくだりを参考に。) copy on right的な機能のあるFilesystemだとうまく回避しているかもしれない(未確認) ファイルを扱うときは、GNU tarのSオプションなり、cpコマンドの--sparseオプションなりをうまく使うこと。

● pipeのバッファ管理
pipeのkernel内部バッファは、デフォルトではPIPE_DEF_BUFFERS(==16)ページまでしか拡張しない。kernel/fs/pipe.cを読むこと。
pipeのバッファサイズの変更については下記が詳しい。
/proc/sys/fs/pipe-max-size - Linuxの備忘録とか・・・
(http://wiki.bit-hive.com/north/pg/%2Fproc%2Fsys%2Ffs%2Fpipe-max-size)

kernel内については下記が詳しい。
Linuxのpipeの実装を見てみる - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
(https://kernhack.hatenablog.com/entry/2014/05/31/190317)

● pthreadのスタック
glibcのpthreadは、スレッドに割り当てるスタックはスレッドが終了しても内部でキャッシュする。allocatestack.cでallocate_stack()関数がget_cached_stack()関数を呼ぶ箇所あたりを参考に。これは下記により1プロセスあたり最大40MBまでキャッシュすることになる。

/* Maximum size in kB of cache. */
static size_t stack_cache_maxsize = 40 * 1024 * 1024; /* 40MiBi by default. */
この値はglibcをコンパイルし直さないと変更できない模様?なお、pthread_attr_setstacksize(3)でスタックサイズを、pthread_attr_setstack(3)でスタックの割当をglibcでではなく自分で行うよう、それぞれ変更できる。

● swith_rootの後処理
switch_root(8)コマンドは、mount(8)の--moveオプション(mount(2)システムコールのMS_MOVE)を行うが、その前に後処理をする。具体的には、/ にあるファイルを消しまくる。busyboxの場合はutil-linux/switch_root.cのbusybox delete_contents()を、util-linuxの場合はsys-utils/switch_root.cのrecursiveRemove()を、それぞれ見よ。

Linux雑多メモ(2018/06/08)

● 昇格時の環境変数
setuid()やcapabilitiesで昇格すると、PATHやLD_LIBRARY_PATHなどの環境変数を失う。セキュリティホールになるからっぽい。でもどこでこれを実装しているのかは見つけられなかった。

● D-Busのuid周り
D-Busは、「AUTH EXTERNAL ********」でuidの番号をasciiにしたものをHEX表現して送る。straceで「31303030」「32303030」などを見かけたら要注意。このため、Linux kernelによるcapabilitiesやDBUS_SESSION_BUS_ADDRESSのpathへのpermissionだけををごまかしてもうまく動かない。/etc/dbus-1/session.conf に「<user>UID</user>」「<policy user="UID" />」とか書く必要がある、らしい。D-Bus Specificationを結構読んだつもりだけど、D-Bus全然わからん・・・

● busyboxの昇格
busyboxは通常本体のバイナリのsuidビットを立てておく。が、これだけで任意のコマンドすべてでroot権限に昇格してくれるわけではない。CONFIG_FEATURE_SUIDでコンパイルした上で/etc/busybox.confにファイルを配置し中身を記述しておく必要がある。

● psのSオプション
看取った子どものCPU使用量も合計して表示してくれるpsのSオプションの働きについては、procps-ngのソースコードを「include_dead_children」でgrepして確かめよ。ポイントは、proc(5)の/proc/[PID]/statの「(16) cutime %ld」「(17) cstime %ld」あたり。なお、子どもに仕事をさせてすぐにexitさせるばかりのシステムだと、psやtopで誰がCPUを使っているのか見えにくいため、psのSオプションは必ず理解しておくべき。

● squashfsの圧縮の種類
squashfsのxzサポートは2.6.39から(https://kernelnewbies.org/Linux_2_6_39)
squashfsのlz4サポートは3.19から(https://kernelnewbies.org/Linux_3.19)
squashfsのzstdサポートは4.14から(https://kernelnewbies.org/Linux_4.14)
どれにするかについて、一般的な圧縮のベンチマークに目が行きがちだけど、squashfsの用途(小さめファイルの部分解凍要求が多い)を考えて決めるべき。zstdが入ったときのcommitメッセージが参考になる。
なお、2016年ごろ世間ではzstd最強説がうたわれたが、ことarm/aarch64に関して言うと、ratioはともかく、decomp速度は大したことない、というかむしろ負けてる?という話がある。こことかこことか。zlibのarm最適化がAndroidプラットフォームで進んでいたおかげかな。
なお、例のごとく、CPU速度と空き具合、ストレージの速度、RAMの余裕具合、フットプリントの許容量、などのバランスにより最適が変わるので、最終的には各々の環境でベンチして決める。ARM Cortex-A9 + eMMCくらいだと、lz4hcあたりがよいみたい。

このアーカイブについて

このページには、2018年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2018年5月です。

次のアーカイブは2018年9月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0