ここ数年、私はコンテナ関連の仕事をたくさん行ってきました。以前、Go の数行でコンテナ フレームワークを作成した Julien Friedman による素晴らしい講演を見ました。このとき、コンテナとは制限された Linux プロセス内の単なるマシンにすぎないことに突然気づきました。
この制限付きビューの構築には、Golang システム コール パッケージの多くの呼び出しが含まれます。最初は表面的なものだけを使用していましたが、しばらくすると、次の層の玉ねぎを剥がして、これらのシステム コールが何なのか、どのように機能するのかを確認したいと思いました。 OSCONでの講演で学んだことを共有します。
名前が示すように、syscall はシステム コールであり、ユーザー空間から Linux カーネルに入るように要求する方法です。カーネルはプロセスの作成などのいくつかの作業を行った後、ユーザー空間に戻ります。
すべてのシステム コールをカーネルに移行させる共通のメカニズムがあり、libc ライブラリによって処理されます。ユーザー空間コードは、必要なシステム コールの ID とシステム コールに渡す必要がある引数を含むいくつかのレジスタを設定します。これは、制御をカーネルに移すための「トラップ」をトリガーします。
これは、ユーザー空間のコードがカーネルにリクエストを行う方法です。Linux には、カーネルがユーザー空間に情報を渡すことを可能にする疑似ファイル システムもあり、その内容は通常のディレクトリやファイルのように見えます。
/proc ディレクトリが良い例です。内部を見てみると、マシン上で実行されているプロセスに関するあらゆる種類の興味深い情報が見つかります。場合によっては、cgroup (コントロール グループ) のように、ユーザー空間は、これらの疑似ファイル システムの下のファイルに書き込むことでパラメーターを構成できます。
コンテナを使用する場合に特に興味深いのは、ホストの /proc にコンテナ化されたプロセスに関するすべての情報が含まれていることです。これには、/proc 疑似ファイルシステムにも保存される環境変数が含まれます。これは、ホストが実行中のすべてのコンテナーの環境にアクセスできることを意味します。資格情報やデータベースのパスワードなどのシークレットを環境変数を介してコンテナに渡すと、セキュリティ上の影響が生じる可能性があります。
従来のプログラムを作成する多くのプログラマは、システム コールをあまり頻繁に使用するとは感じていないかもしれません。しかし実際には、ファイルの作成やディレクトリの変更などの日常的なアクティビティには Linux システム コールが含まれるため、これらは頻繁に呼び出されます。
システム コールを楽しむのにシステム プログラマである必要はありません。
Liz Rice - Liz Rice は、Aqua Security のテクニカル エバンジェリスト兼コンテナ セキュリティの専門家です。以前は、Microscaling Systems を共同設立し、そのリアルタイム スケーリング エンジンと、人気のある画像メタデータ Web サイト MicroBadger.com を開発しました。彼女は、VOD、音楽、VoIP などのデジタル技術分野だけでなく、ネットワーク プロトコルや分散システムに至るまでのソフトウェアの開発、チーム、製品管理において豊富な経験を持っています。
以上が初心者が Linux システムコールを学ぶためのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。