衝撃のわからなさ

わかってません

2024/02/05日報

dax_extrasを最新のdaxに追従

最新のdaxはbun shellに影響を受けて結構いろいろなものがサポートされている。

  • pipeが実装されたのでdax_extrasから削除
  • stdout($.path)がサポートされたので$`command`.toFileは消そうと思ったが、 fileoptionが指定できるという点でまだ価値があるので残した

Bump up dependencies

mimic-cross実装

依存ライブラリ更新

更新されたdaxstdin($.path)を使いたかった。

commit: Bump up dependencies

pythonまわりの実装

道半ば、sysconfigの偽装などをやった

2024/02/04日報

Pythonのモジュール検索パスについて整理する

The initialization of the sys.path module search path — Python 3.12.1 ドキュメント 読むと._pthを置くとデフォルトパスを上書きできるように思えたが、 実際は._pthで参照するパスが追加される挙動だった。
これではmimic-crossの用途に合わなそうなのでPYTHONPATHをメインに使うことにした。
Ubuntuにaptで入れたものを対象に配置するには/usr/lib/python3.10/dist-packages/python310.pth

カレントディレクトリ、PYTHONPATH、system path、vnev or ディストリのパス というような順番。

$ pwd
/home/impactaky/envtest
$ PYTHONPATH=foo:bar python3 -c "import sys; print(sys.path)"
['', '/home/impactaky/envtest/foo', '/home/impactaky/envtest/bar', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/impactaky/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.8/dist-packages']
$ python3 -m venv env
$ source ./env/bin/activate
$ PYTHONPATH=foo:bar python3 -c "import sys; print(sys.path)"
['', '/home/impactaky/envtest/foo', '/home/impactaky/envtest/bar', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/impactaky/envtest/env/lib/python3.8/site-packages']

mimic-cross実装

mimicx pythonの実装

とりあえず基本的な部分を実装した。
* mimic pythonでhostのpythonがPYTHONPATHとLD_LIBRARY_PATHの特殊化付きで呼び出される * MIMIC_CROSS_DISABLE=1でnativeなpythonが呼び出される

commit: Implemen mimic python basic feature

2024/02/03日報

configファイルの形式について考える

現在はjsonだが、変更がまぁまぁつらいので見直す。

一部抜粋からChatGPTに比較対象出してもらう

{
  "apt": { "useCustomFunction": true },
  "base-files": {},
  "fdisk": {},
  "git": {},
  "gcc-11": { "isCrossTool": true },
  "gcc-11-aarch64-linux-gnu": {
    "blockList": [
      "/usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2",
      "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper",
      "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1"
    ]
  }
}

yaml

apt:
  useCustomFunction: true
base-files: {}
fdisk: {}
git: {}
gcc-11:
  isCrossTool: true
gcc-11-aarch64-linux-gnu:
  blockList:
    - /usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2
    - /usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper
    - /usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1

toml

[apt]
useCustomFunction = true
[base-files]
[fdisk]
[git]
[gcc-11]
isCrossTool = true
[gcc-11-aarch64-linux-gnu]
blockList = [
  "/usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2",
  "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper",
  "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1"
]

キーのソート

キーのソートと、ソートされているかの確認ができると嬉しい。 json, yaml, tomlそれぞれのキーのソートができるCLI

json

jq -S '.' input.json > output.json

これだとrootしかsortしてくれない。つらい。
listまでsortしようとするとめんどい。

yaml

yq -i -P 'sort_keys(..)' input.yml > output.yaml

jqと違ったので困惑した。 jqと同じくlistまでsortしようとするとめんどい。

toml

taploでできそうなのだが、reorder_keysにして実行してもうまく動作する気配がない…

結論

listのsortはチェックだけ自動にできれば、編集自体はまぁ手動でいいかという気持ち。 daxで読むのが楽だからjsonのままでいいや

mimic-cross実装

クロスツールチェーン対応

isCrossToolというオプションを足して実装した。
binutilsのexampleがビルドできるようになった。一回とりあえず流してみて34.4sで旧実装と同等の速度。

commit: Support cross tool chain

sudoのサポート追加

sudoは自前dlopenする系コマンドで特別対応をする必要がある。
旧実装でサポートしているので対応した。
モジュールの依存パスが/usr/lib/sudoから/usr/libexec/sudoにどこかのタイミングで変わっているっぽい。
サポートするアーキテクチャを増やすときに対応が必要そう。
実装したからサポート追加したが、こういう系はコストに合わなくなると思うのでmimic化対象からはずすかもしれない。

commit: Support sudo

pythonの旧実装整理

  • .soを含むものはhostにもapt-getしてもらわないといけない。旧実装のpostinstallが空なのは多分そういうこと
  • sysconfig.get_config_vars()を偽装する必要がある。一旦native実行した結果を固めて参照するようにパッチする
  • arch埋め込まれているため、distutils/sysconfig.pyにパッチを当てる
  • MIIMC_CROSS_DISABLE=1 のときはnativeのpythonが呼び出される
  • -m pipが含まれている場合はpip用の特殊処理パスに入る
    • hostにも同時にpipする
  • -m venvが含まれるときも特殊処理
    • hostにも対応するvenvを用意
  • python3 -c "import xxx; print(xxx.__path__)"へのworkaroundとしてpathが含まれていたらnative呼び出ししている
    • これは-cでinline呼び出しされるときはnativeがいいように思う
  • PYTHONPATHとLD_LIBRARY_PATHの先頭にhostのrootをprefixしたものをつけることでhost側にあるものが使われるようにする
  • venvに対応するため呼び出し元の$0をキープして実行される必要がある
    • exec -a "$0"
    • qemu-user-static -0 "$0"

2024/02/02日報

mimic-cross実装

mimic-libをzigで書き直す

指定パスにarchitectureを書き込んだファイルを置いておいて、 それをもとにmachineの偽装をするようにした。\ これで同じバイナリをhostにchrootしたときとmimic-cross環境に偽装したとき、 それぞれで適切な振る舞いしてくれる。

commit: Determine mimiced architecture from file

hostのバイナリを直接変更するための仕様変更

mimic-deployがhost側へ破壊的な変更を加えるようにする ことに決めたが、 一方でhostにchrootしたときに正しく動作することは保つ必要がある。
これまでの実装ではRUNPATHに特殊なパスが含まれていた場合は host側環境のライブラリパスを向くように書き換えていたが、 host側環境のライブラリパスをprefixとしてつけるようにして chroot下でもmimic-cross環境下でも動作するようにした。

commit: RUNPATH to be prefixed rather than substitute

2024/02/01日報

mimic-cross実装

mimic-deployがhost側へ破壊的な変更を加えるようにする

一部のコマンドが相対パスを仕様して動く都合上、
target側はhostへのシンボリックリンクで運用すると実装が楽なことに気づいた。 この変更はDocker imageのサイズ削減も見込めるので採用することにした。

cのmimic-libをzigで書き直す

mimic-libでファイルを読み書きする必要がでた。
なんでC言語でファイルを読み書きしないといけないんだ2024年だぞという気持ちになったのでzigで各方法勉強した。
どちらかというとzig.buildのほうがいろいろ調べる必要がある。

とりあえず、決め打ちの値への偽装がこんな感じ。
CImportとか必要なくzigの機能で足りてる。たのしい。

const std = @import("std");
const linux = @import("std").os.linux;

export fn uname(buf: *linux.utsname) usize {
    const ret = linux.uname(buf);
    if (ret < 0) {
        return ret;
    }
    std.mem.copy(u8, &buf.machine, "mimic!!");
    return ret;
}

2024/01/28日報

mimic-cross実装

46個のサポートパッケージ追加

従来のmimic-crossがサポートしているpackageの中で、
単純なdeployで済むもののパッケージを足した。

commit: Suport basically packages

パッケージ設定はjson拡張だけで設定できるように拡張

パッケージ拡充は実行速度に直に影響する大事な項目なので、追加工数を下げる作業をした。

  • useCustomFunction がtrueでない場合はモジュールは探索しない
  • blockListを変えたい場合はカスタム関数ではなくてjsonの設定だけで対応できるように
{
  "apt": { "useCustomFunction": true },
  ...
  "hostname": {},
  "libc-bin": { "blockList": ["/sbin/ldconfig.real"] },
}

commit: Enhance supported.json

2024/01/27日報

ディストリの/usr mergeについて調べた

最近libとかが/usr/libのsymbolicになってるの何?と思ってたけど、
ちゃんと調べたらそういう動きがちゃんとあった。

この4サイトをChatGPT4に要約してもらったの貼っとく

/usrマージは、Linuxシステムのファイルシステムを単純化するためのプロセスです。
これにより、/bin、/sbin、/lib、/lib64などのディレクトリが /usr下の対応するディレクトリに統合されます。
主な目的は、システムの互換性向上、ファイルシステムの整理、 OSのパッケージングの簡素化、セキュリティ強化、およびメンテナンスの容易化です。
DebianFedoraなどの主要なディストリビューションは、この変更を採用しています。 この変更により、システムの読み取り専用マウントやスナップショット作成が容易になり、 複数のシステム間での共有も効率的に行えるようになります。

freedesktopの記事には、もともとは起動速度のためにマウントポイントを分けたくて、 ただ今は別に分ける必要ないどころかなんならinitramfsが/usrを要求してるみたいなこと も書いてあった。

mimic-cross実装

セットアップスクリプト

setupスクリプトの呼び出しでmimic-cross環境がセットアップされるようになった

commit: Support setup by script

サポートされているpackageを管理するjsonを追加

これまではpackage.tsを置くことでサポート対象としていたが、
自動判定がある程度うまく書けたので空のファイルを大量に置くことになってしまう。
supported.jsonを作成してデフォルトの挙動で良い場合は このファイルに追加するだけで済むようにした。

特殊な挙動をさせたい場合には、supported.jsonに追加した上でpackage.tsも配置する。

commit: Use supported.json