問題タブ [linux-namespaces]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - Linux ネットワーク名前空間の予期しない動作
だから私は最近ネットワーク名前空間をいじっています。簡単なコードをまとめてビルドしたところ、非常に奇妙なことが起こっていることに気付きました。
コードは次のとおりです。
さて、このコードを Trusty 14.04 で実行すると、奇妙なことが起こっていることがわかります。これは、バイナリを連続して数回実行した場合に発生します。
すべてのホストのインターフェースを出力する場合もあれば、単にループバック インターフェースのみを出力する場合もあります。これは、プログラムの最後の範囲ループが、名前空間がまだアタッチされているときに 1 回実行されているように見えたり、すでにデタッチされているときに実行されているように見えることを意味します。
なぜこれが起こっているのか完全に混乱していますが、それは私のコードであるか、プログラムの実行やカーネルに関するものを見逃しているだけだと思います。
どんな助けでも大歓迎です。
ありがとう
Update1: したがって、「奇妙な」動作は、golang が OS スレッド間で goroutine をスケジュールする方法に関係しているようです。そのため、ランタイムを適切に処理する必要があります。つまり、コードの実行を 1 つの OS スレッドに固定すると、一貫した結果が得られるということです。これを行うには、次のランタイム パッケージ ステートメントを追加します。
ただし、これでも問題は解決しませんが、名前空間を理解することがすべてだと思います。私はそれをもっと調べる必要があります。
Update2: システム コールを多数実行しているときに上記の OS スレッド ロックを使用し、正しい動作の同様の「奇妙さ」を経験する理由についてもう少し詳しく説明するには、このブログ投稿を読んでください。ランタイムと go スケジューラについて説明します。これは go 1.1 用に書かれていますが、それでも非常に優れた概要を示しています。
linux-kernel - task_struct と pid_namespace の関係は?
私はいくつかのカーネル コードを研究しており、データ構造がどのように相互にリンクされているかを理解しようとしています。スケジューラがどのように機能するか、および PID とは何かについての基本的な考え方を知っています。しかし、このコンテキストで名前空間が何であるかはわかりません。また、それらすべてがどのように連携するかを理解することもできません。
いくつかの説明 (O'Reilly の「Understanding the Linux Kernel」の一部を含む) を読み、1 つのプロセスが終了して ID が再割り当てされたため、同じ PID が 2 つのプロセスに到達した可能性があることを理解しました。しかし、これがどのように行われるのかわかりません。
そう:
- このコンテキストでの名前空間とは何ですか?
task_struct
との関係はpid_namespace
?(私はすでにそれが関係していると考えていましたがpid_t
、方法がわかりません)
参考文献:
- の定義
pid_namespace
- の定義
task_struct
- の定義(そのすぐ下
upid
も参照)pid
linux - セキュリティのための Docker のベスト プラクティス
インターネットで見つけられるほとんどの Dockerfile は、root としてソフトウェアをビルドして実行します。これはみんなを怖がらせなければなりませんよね?...しかし、そうではないようです...
したがって、コンテナ内のルートはコンテナ外のルートとまったく同じであるため、コンテナー内であってもサーバーをルートとして実行することは危険です。
解決策の 1 つは、この tor リレーの例のように "USER" 命令を使用して Dockerfile を適切にビルドすることです。
別の解決策は、「linux ユーザー名前空間」を使用して、コンテナー内の UID/GID をコンテナー外の UID/GID に「マップ」することです。たとえば、コンテナー内のルート (uid=0) は、ホスト内の個人ユーザー アカウントにマップできるため、共有ボリュームで作成されたファイルには適切なアクセス許可が付与されます。
だから私の質問は次のとおりです。Docker のセキュリティに関しては、ベスト プラクティスは何ですか? 非ルートとしてコードを実行します (つまり、Dockerfile の USER 命令) ? または「ユーザー名前空間」を使用して?または、最終的に(または追加で) selinux および/または AppArmor を使用して?
ありがとう :)
linux - ネットワーク アダプタで Linux 名前空間を見つける方法は?
複数のネットワーク名前空間が定義された Linux サーバーがあります。
各名前空間には、1 つ以上の仮想ネットワーク アダプターが含まれています。この場合は、TAP デバイスです。
ここで、アダプターのtapda4018ab-b7
名前はわかっているとしますが、それが属する名前空間はわかりません。名前空間を1つずつチェックせずに調べる方法はありますか? これを行うための一般的な Linux コマンドはありますか? または、少なくとも OpenStack Neutron 固有のコマンドですか?
linux - 親プロセスの端末の切り離し
Linux で名前空間を試しているので、debootstrap で作成された Debian Wheezy 環境を分離する小さな C プログラムを書いています。
sysv-init を正常に起動してログイン プロンプトを表示できましたが、システムをシャットダウンするか -9 init を強制終了して分離環境を閉じると、端末は制御端末がシェルに接続されていないように見える状態のままになります。具体的には、sudo を開始すると、端末が存在しないと不平を言います。
sudo の失敗ポイントを次のステートメントに絞り込みました。
エラーENXIO(つまり、「そのようなデバイスまたはアドレスはありません」)。
なぜこれが起こるのかを理解しようとしています.initのsetsid()システムコールに関連していると感じていますが、正確なシナリオを再現できなかったため、適切なテストケースを提供できません.
私にとって本当に奇妙に思えるのは、init (フォークされたプロセス、したがってシェルの子) が現在の端末から切り離されるだけでなく、GUI 端末までのプロセスのすべての階層が tty からも切り離されることです。それがどのように起こるのか理解できないようです。
さらに、異なるコマンド間にはいくつかの矛盾があります。
この状況についての手がかりは高く評価されます。
編集:「/dev/tty」のカーネル ソース コードを見ると、問題はカーネル側の char デバイスの参照カウントに関連していると思います。実際、「/dev/{console|tty0|tty1}」出力を現在の pty にリダイレクトするために、シェルの制御端末をコンテナーのマウントされた dev 内のデバイス ファイルにバインド マウントしました。
EDIT:Linuxカーネルでは、「tty_open_current_tty()」関数のこのステップでエラーが報告されているようです:
編集: 問題は、制御 tty を「盗む」という概念に関連しているようです。これは、TIOCSCTTY をコマンドとして、1 をパラメーターとして使用して、CAP_SYS_ADMIN
機能およびioctl()
tty ファイル記述子の呼び出しの下で実行できます ( tty_ioctl(4)を参照)。これを確認し、報告するためにテスト ケースを書きます。
linux - コンテナ間でネットワーク名前空間を共有する lxc
lxc コンテナー deb1 を開始しようとして--share-net
おり、ネットワーク名前空間を共有するために別のコンテナー deb2 を開始するために使用しています。しかし、fedora と Ubuntu i の両方で以下のエラーが発生します。
オプションを使用した人はい--share-net
ますか?
linux - Linux VXLAN ドライバーとネットワーク名前空間
Linux カーネルの vxlan ドライバー コードを理解しようとしています。カーネルのバージョン: 3.16.0-29-generic
これを見るとvxlan.c
、VNI ごとに vxlan dev が作成され、netdevice が属する netns に関連付けられており、dev ごとに udp ソケットが作成されているように見えます。
ethx
ただし、物理デバイスは vxlan デバイスと同じ netns に属している必要があるため、グローバル netns を除いて、vxlan デバイスを物理デバイス ( ) に実際に接続することはできないため、これには少し困惑しています。
例: グローバル netns に vxlan リンクを作成すると、期待どおりに動作します。
ネットワーク名前空間で同じことをしようとしても、うまくいきません:
ここでの問題は、追加されるリンクと同じ netns に eth0 があるかどうかをコードがチェックするため、「dev eth0」が気に入らないことです。
eth0 なしで同じデバイスを作成すると、正常に動作します。
キャリアを vxlan デバイスに接続できない場合、どうすればホストの外部との間で本当に tx/rx パケットを送受信できますか?
現実的には、グローバル netns でのみ vxlan ドライバーを使用できるということですか、それともブリッジで使用する必要があるということですか?
vxlan パケットには VNI が関連付けられています。これを使用して、実際に macvlans で可能なことと同様に、非グローバル netns の dev にパケットを直接送信できるはずです。
何か不足していますか?
linux - LXC はネットワーク名前空間をどのように実装しますか?
LXC がネットワーク名前空間を実装する方法を知りたいです。特定の側面の 1 つは、名前空間内の仮想インターフェイスを物理インターフェイスに接続する方法です。名前空間のネットワークが veth に接続し、ルート名前空間が eth0 を使用すると仮定すると、LXC はどのように veth を eth0 に接続するのでしょうか? Linux ブリッジまたは OpenVswitch を使用していますか?
c - Linux システム コール unshare(CLONE_NEWNET) でパフォーマンスのボトルネックを特定する方法
ネットワーク名前空間を常に作成および削除する Linux アプリケーション (C で記述) があります。通常、作成/削除サイクルには約 300 ミリ秒かかります。
パフォーマンスの調査中に、プログラムで strace を実行して、どのシステム コールに最も時間がかかっているかを調べました。strace の出力から、私のシステムでは unshare の最初の呼び出しに 4 ミリ秒しかかからないようですが、その後の呼び出しには 200 ミリ秒近くかかります。
サイクル (内部制御サイクル) の開始時にネットワーク名前空間を作成し、サイクルの最後に名前空間を削除するように構成されたプログラム。
実験のために、制御サイクルの最後にネットワーク名前空間を削除しないようにアプリケーションを変更しました。新しいネットワーク名前空間のみを作成し、決して削除しないでください。これにより、パフォーマンスが大幅に向上し、システム コールの共有を解除するための後続の呼び出しで遅延が発生しなくなりました。各 unshare システム コールには 2 ~ 3 ミリ秒かかります。
明らかに、ネットワーク名前空間を削除すると、その後のネットワーク名前空間の作成に何らかの影響/遅延が生じます。
ここで何が起こっているのでしょうか?これをさらにデバッグするにはどうすればよいですか?
Linux カーネル 3.12.9-301.fc20.x86_64 を使用しています。
linux-kernel - ネットワーク名前空間の監視
カーネルで netns の作成/削除を監視する方法はありますか?
iproute2 はこれを監視する手段を提供しますが、inotify を使用して実行し、netns fd の作成/削除を探し/var/run/netns
ます。多くの場合、netns はエントリなしで作成され/var/run/netns
ます。
理想的には、カーネルから netlink メッセージを介して netns の作成/削除通知を利用できるようにする必要がありますが、そうではないようです。
作成を監視して/proc/<pid>
から stat(ing) /proc/<pid>
/ns/net を実行することは、実行可能なオプションのようには思えません。