ほとんどの Linux 愛好家は、時間が経つにつれて、苦労して手に入れたトリックでいっぱいのきらめく軍の宝箱を手に入れます。これは、状況によって端末ですばやく考える必要がある場合に非常に役立ちます。私は何年にもわたって、また Linux に非常に精通している人物の肩越しに見守る機会があればいつでも、これらの知識の多くを隠してきました。 今日、あなたはターミナルで私とペアを組んでいます。私たちは、Linux ファイルシステムとシェル ツールとトリックの深さを探っています。 を持っていく /proc Linux システムで最も便利なディレクトリの 1 つは です。 の ページから: /proc proc man proc ファイルシステムは、カーネル データ構造へのインターフェイスを提供する疑似ファイルシステムです。 ページに「疑似ファイルシステム」と書かれている場合、ディスクの下をのぞくと、 のテキストファイルの場合と同様に、ファイルを表すビットが見つかると予想される場合、そこにあることを意味します には何もありません。それは実行中の Linux システム上に存在し、生きていますが、ディスクを取り出して検査すると、まったく存在しません。 実行中のカーネルのコントロール パネル! man /tmp/launch-codes.txt /proc /proc 今自分の を調べてみると、次のような多くのディレクトリが見つかるかもしれません: /proc ls /proc 1 10 10021 10059 10144 ...hundreds more files... これらの数字はそれぞれ、プロセス ID ( ) を表します。はい、ブラウザーまたはターミナル プログラムのプロセスを識別するのと同じ です。実際、プロセス自体に関する多くの情報を調べることができます。たとえば、Linux システムのプロセス は伝統的に最上位の プロセスであり、最近のほとんどのシステムでは systemd ベースであることを思い出すかもしれません。私のシステムで を開始したコマンドを見てみましょう。 PID PID 1 init PID 1 cat /proc/1/cmdline /run/current-system/systemd/lib/systemd/systemd は、プロセス を開始したコマンド (この場合は 自体) を示すファイルです。 cmdline 1 systemd には特に便利な ファイルがあります - は、起動時にカーネル自体に渡される引数を実際に示します。私は非常に冗長ですが、私のシステムが起動した と、他のフラグ (私の場合は と ) を教えてくれます。 /proc cmdline /proc/cmdline initrd init loglevel cat /proc/cmdline initrd=\efi\nixos\hx5g5rmvq748m64r32yjmpjk3pmgqmr1-initrd-linux-5.17.11-initrd.efi init=/nix/store/9zvklk45yx41pak2hdxsxmmnq12n712k-nixos-system-diesel-22.05.20220604.d9794b0/init loglevel=4 私の NixOS ホスト名は です。ラップトップに石油を入れていないことに注意してください。 diesel は読み取り専用だけではありません。そのマニュアルページにあるように、 はカーネルへの であり、カーネル自体との対話が含まれます。 ディレクトリにはさまざまなノブやダイヤルがありますが、カーネルの仮想メモリを確認できる を紹介したいと思います。もっと冒険したいですか? /proc /proc インターフェース /proc/sys /proc/sys/vm 私のマシンの現在のメモリ使用量を考慮してください。 free -h total used free shared buff/cache available Mem: 31Gi 22Gi 3.0Gi 4.4Gi 5.6Gi 3.6Gi Swap: 31Gi 130Mi 31Gi ここではそれほど珍しいことはありませんが、メモリを積極的に解放したい場合はどうすればよいでしょうか?ほとんどの場合、キャッシュにメモリを使用することに関しては、カーネルが最もよく知っていますが、クリアしても安全なメモリをクリアしたい状況がいくつかあります。実行中のプロセスを壊したくはありません。可能であれば、メモリを再利用します。 そのためのファイルがあることがわかりました。通常、 は書き込み保護されており、必要なファイルに書き込むことができるのは のみであるため、 コマンドを にパイプします。 /proc/sys/vm root echo sudo tee echo 1 | sudo tee -a /proc/sys/vm/drop_caches このコマンドが行うことは、実質的に、「システムで実行中のプロセスを中断せずに失われてもよいメモリ内のキャッシュを削除してください」ということをカーネルに通知することです。私のマシンでは、これにより約 500M のメモリが開きます。 total used free shared buff/cache available Mem: 31Gi 22Gi 3.5Gi 4.4Gi 5.1Gi 3.6Gi Swap: 31Gi 130Mi 31Gi 涼しい! には、このような興味深いことを実行できるあらゆる種類の便利なファイルのようなオブジェクトがあります。詳細を知りたい場合は、お気軽に を開いてください。 /proc man proc 有史以前の としての curl /dev のようなキャラクター デバイスは接続されたディスクを表しますが、 パスには別の用途があります。ネットワーク リクエストを送信するあまり知られていない方法です。 /dev/sda /dev パス は、実際には Linux カーネルによって公開されるファイルのようなデバイスではありませんが、実際には などの選択したシェルの機能です。シェルは、ポート でリッスンしている Web サーバーなどのリモート エンドポイントへの低レベルのソケット接続を開くために、このパス上の操作をインターセプトできます。 /dev/tcp bash 80 まず、目的のエンドポイントとポートを示す のファイル パスに接続された新しいファイル記述子を開きます。ファイル記述子番号 0、1、および 2 がそれぞれ 、 、および を表すのと同じように、この新しいファイル記述子 3 は、リモート ネットワーク エンドポイントへのパイプを表すと考えることができます。ここからは の使用を前提とします。 /dev/tcp stdin stdout stderr bash exec 3<>/dev/tcp/httpbin.org/80 次に、単純な HTTP 要求の平文形式をオープン ファイル記述子に送信します。 へのこの リクエストでは、ほとんどのリバース プロキシで適切に処理するために、 ヘッダーを設定する必要もあります。 2 つの改行は、リクエストの終了を示します。 /status/200 GET Host echo -e "GET /status/200 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n" >&3 最後に、単純な読み取り操作で HTTP 応答を取得します。 cat <&3 次のような応答が表示されます。 HTTP/1.1 200 OK Date: Fri, 10 Jun 2022 21:39:43 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true おめでとう!シェルだけを使用して HTTP リクエストを送信しました。 で泳ぐ /sys と に飛び込んだ後、探索すべきルートレベルのディレクトリがもう 1 つあります。謎めいた ディレクトリです。 /proc /dev /sys や と同様に、 は、オペレーティング システムに非常に近い低レベル メカニズムへの別のファイルのようなインターフェイスです。比較的プロセス中心の や、ブロック デバイスなどをモデル化する とは異なり、 は、カーネルがモデル化する多くの抽象化への便利なインターフェイスです。 /proc /dev /sys /proc /dev /sys たとえば、ディレクトリ を取り上げます。このディレクトリ内に、ホストのネットワーク インターフェイスを表すリンクのリストがあります。これが私のものです: /sys/class/net ls /sys/class/net enp0s20f0u6u4u1 lo tailscale0 wlan0 ご覧のとおり、システムが管理しているアクティブなネットワーク接続には、有線インターフェイス ( で始まるインターフェイス)、 ループバック インターフェイス、 インターフェイス、ワイヤレス インターフェイス が含まれます。これらのディレクトリのいずれかの内容を一覧表示すると、ファイルの長いリストが表示されますが、特に私の有線ネットワーク インターフェイスの 2 つのファイルを詳しく見てみましょう。 en lo Tailscale wlan0 cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes 11281235262 274308842 これらの各ファイルは、それぞれ受信バイト数と送信バイト数を表します。数秒後に同じコマンドを使用すると、数値がどのように変化するかを確認してください。 cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes 11289633209 274760138 もっと大きな数字!どうやら私は自分の帯域幅を最大限に活用しています。これはどのように役立ちますか? ネットワーク使用状況ウィジェットがどのように作成されるのか疑問に思ったことはありませんか?では、自作してみませんか? ディレクトリ内の前述のファイルを使用してネットワーク アクティビティ レートを導き出すこの小さな スクリプトを確認してください。 statistics bash interval=1 interface=$1 rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) rx_bytes_rate=0 tx_bytes_rate=0 function fmt() { numfmt --to=iec-i --suffix=B $1 } while true do echo -en " $(fmt $tx_bytes_rate)/s ⬆ $(fmt $rx_bytes_rate)/s ⬇\t\r" sleep $interval old_rx_bytes=$rx_bytes old_tx_bytes=$tx_bytes rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) tx_bytes_rate=$(( ($tx_bytes - $old_tx_bytes) / $interval )) rx_bytes_rate=$(( ($rx_bytes - $old_rx_bytes) / $interval )) done このスクリプトを のどこかに配置し、 で実行可能にして、 で試すことができます。私のマシンでの出力は次のようになります。 $PATH chmod +x <script> script.sh <interface name> 13KiB/s ⬆ 379KiB/s ⬇ それはいいね!これにはいくつかの用途が考えられます。たとえば、コマンド出力をレンダリングできるツールのウィジェットとして、または特定のネットワーク インターフェイスのネットワーク アクティビティをすばやく確認する方法として使用できます。どちらの場合でも、このデータへのファイルベースのインターフェイスにより、データへのアクセスと使用が非常に簡単になります。 さらなる探索 これは、最新の Linux システムの機能をさらに詳しく調べる際に利用できる情報の種類を少し掘り下げただけです。 内のさまざまなディレクトリの機能と目的を読むために、このような追加のガイドを検索するか、 のようなエントリの ページを読んでソースに直接アクセスできます。 / man hier man 楽しく探検しましょう!