バーンアウトHDMIインターフェース。 アパートの給水システム:ネットワークの種類とスキーム。 温水と冷水の供給デバイスの温水と冷水の接続
オリジナル:いくつかの気の利いたudevルールと例
著者:Vimal Daga、Davender Singh
発行日:2012年6月28日
翻訳:A。パニン
翻訳発行日:2012年10月23日
Greg Kroah-Hartman、Kay Sievers、Dan Stekloffによって開発されたudevを使用すると、フラッシュドライブ、ハードドライブ、カメラ、携帯電話をLinuxシステムに接続することが、これまでになく簡単になり、管理しやすくなります。 2.6 Linuxカーネルで最初に導入されたudevは、実行中のシステムへのホットプラグデバイスとコールドプラグデバイス(プリパワー)の両方を処理します。 この記事では、/ devディレクトリにデバイスファイルを動的に作成するプロセスを順を追って説明し、使用できる、または単に楽しみのために使用できる設定の例をいくつか示します。
Udevは、devfsデバイスファイルシステムのユーザースペース実装を指します。 システムには、カーネルイベント(uevents)に応答して/ devディレクトリにあるLinuxデバイスファイルを動的に管理するために使用されるudevdサービス、構成ファイル、およびルールファイルが含まれています。 Udevは、2.6 Linuxカーネル以降、古いdevfs実装を完全に置き換えました。
デバイスファイル管理システムの完全に再設計された実装が必要なのはなぜですか? そして、なぜudevはそれほど成功したのですか? 答えを得るには、Linuxデバイスドライバーインターフェイスの開発の歴史を考慮する必要があります。
各デバイスファイルには、マイナー番号とメジャー番号の2つの8ビット値が関連付けられています。 各デバイスドライバーにはメジャー識別子があります。 このドライバの下にあるすべてのデバイスファイルは、同じメジャー識別子を持っています。 マイナーデバイスIDは、このドライバーを実行しているデバイスごとに異なります。
Linuxの以前のバージョンでは、/ devファイルシステムには、システムに接続できる(およびデバイスドライバーによって制御できる)デバイスごとに1つの静的ファイルが含まれていました。 残念ながら、このアプローチには多くの問題がありました:特にサポートされるデバイスの数が増えるにつれて、すべての可能なデバイスに割り当てるのに十分なID値がありませんでした。 また、18,000を超えるデバイスファイルを使用するには、多くの追加のディスク領域が必要でした。 これらの問題は、udevがマイナーおよびメジャーデバイスファイルIDを無視できるようにすることで対処されました。
USB機器などのデバイスをホットプラグする場合、デバイスファイルの命名と識別に一貫性がありませんでした。 たとえば、2台のUSBプリンターを備えたシステムでは、一方のプリンターをファイル/ dev / usb / lp0で表し、もう一方のプリンターをファイル/ dev / usb / lp1で表すことができますが、どちらを正確に理解することはできません。プリンタは、このファイルまたはそのファイルで表されます。 この動作は、コンピューターが以前に起動または接続されたときにオンにされたデバイスによって変わる可能性があります。または、デバイスがUSBハブに接続されているか、システムのUSBポートに直接接続されているかによって変わる可能性があります。 この動作は、ユーザーにとって常に苛立たしく混乱を招きます。 Udevでは、ルールを使用して永続的なデバイス名を指定できます。
他のudev機能は、devfsから継承された問題の多くを解決します。
- udevはユーザースペースで実行されるため、カーネルコードの量と複雑さが軽減されます。
- udevを使用すると、デバイスの電源がオンになる順序やバス上のデバイスの場所に関係なく、一定のデバイス名を割り当てることができます。
- udevは、/ devディレクトリ内のファイルを動的に変更し、システムに存在して接続されているデバイス専用のファイルを作成します。 デバイスファイルへのシンボリックリンクを使用して、任意のデバイス名を割り当てることもできます。
- udevはデバイス情報をユーザースペースアプリケーションに提供し、この情報を取得するために内部カーネル構造にアクセスする必要をなくします。
udevのしくみ
udevdサービスは、デバイスが接続または切断されたときにカーネルによって生成されたイベントをnetlinkソケットでリッスンします。 これらのイベントは、udevmonitorコマンドで監視できます-実行し、フラッシュドライブなどのUSBデバイスを接続し、プラグを抜きます(新しいディストリビューションにはudevmonitorがない場合があります-その場合はudevadmを使用します)。
起動時に、udevはtmpfsファイルシステムを/ devディレクトリにマウントします。 次に、デバイスファイルが/ lib / udev / deviceディレクトリから/ devディレクトリにコピーされ、udevはコールド接続されたデバイスのカーネルイベントの受信を開始します。 /etc/udev/rules.dディレクトリは、デバイスパラメータの変更、デバイスファイルへのシンボリックリンクの作成などに使用されます。 ホットプラグデバイスの場合、udevdはD-Busを使用してカーネルイベントを受け入れ、/ sysファイルシステムから新しいデバイスの属性を取得し、属性に基づいてルールを適用します-その後、デバイスファイルが/ devに作成されますファイルシステム。 Udevでは、「モダリア」メカニズムを使用して専用のデバイスドライバーをロードすることもできます。
Udevのルールと例
Udevは、ルールと構成ファイルに基づいて動作を変更する機能を提供します。 システムに付属するルール(通常は/lib/udev/rules.dにあります)の動作をオーバーライドしたり、ニーズに合わせてカスタム機能や特定の機能を追加したりできます。 ルールは、個々のユーザールールのディレクトリである/etc/udev/rules.d/ディレクトリに追加できます。
このディレクトリに独自のルールを作成します(デバイスファイル名の割り当て、シンボリックリンクの作成、アクセス許可の設定、およびその他の必要なアクションの実行)。 ルールが他のルールよりも優先されるようにするには、ファイル名が、その後に従わなければならない残りのルールよりも小さい番号で始まることを確認します(たとえば、10-local.rules)。
管理者がUSBドライブを接続するまで、rootユーザーアカウントを無効にしますBUS \u003d\u003d "usb"、SUBSYSTEM \u003d\u003d "block"、PROGRAM \u003d "/ bin / enable_root_login"
このルールを機能させるには、システムに接続されているデバイスのシリアル番号を取得し、それを管理者のデバイスの既知のシリアル番号と比較するために、指定された名前でアプリケーションまたはシェルスクリプトを開発する必要があります。 シリアル番号が一致する場合、プログラムは認証に必要なpam_deny.so行を/etc/pam.d/loginファイルから削除します。これにより、rootユーザーとしてログインできるようになります。 他のUSBデバイスが接続されている場合、ファイルの変更は行われません。 逆に、USBメディアが取り外されるとすぐに、この行はファイルに再び追加されます。
このルールはRHEL5.0ディストリビューションでテストされ、正常に機能しましたが、suコマンドを使用するか、起動時にシングルユーザーモードに入ると、このルールは機能しません。 suコマンドを使用するときにrootログインを無効にするには、次のようにします。
- /etc/security/access.confファイルを編集して、root:ALLという行を追加します。
- 2行目に追加するファイル/etc/pam.d/system-authを編集します アカウントが必要ですpam_access.so.
- ファイル/etc/pam.d/suを編集し、このファイルの最初の行を行アカウントにsystem_authを含めます。
もちろん、これらのアクションはenable_root_loginプログラムによって実行する必要があります。 USBデバイスのシリアル番号が管理者に属していることを確認した後、プログラムはファイルに加えられたすべての変更を削除する必要があります。接続されたデバイスが管理者に属していない場合は、ファイルに対して上記のすべてのアクションを実行します。
これらの手順では、シングルユーザーモードでrootとしてログインする必要はありませんが、GRUBブートローダーでパスワードを設定して、シングルユーザーモードに簡単にアクセスできないようにすることができます。
次のコマンドを使用して、デバイスのシリアル番号、デバイス名、ベンダーID、製造元名、およびその他のパラメーターに関する情報を取得できます。udevinfo-a -p / sys / block / sdb
新しいディストリビューションにはudevinfoがない場合があります。その場合、udevinfoの代わりにudevadmを使用する必要があります。
すべてのUSBポートを無効にするバス\u003d\u003d "usb"、オプション+ \u003d "ignore_device"
このルールの結果、システムのUSBポートに接続されているすべてのデバイスが切断されます。USBプリンター、キーボード、およびマウスは機能しません。 ご使用の際はご注意ください!
USBポートに接続されているすべてのブロックデバイスを無効にするBUS \u003d\u003d "usb"、SUBSYSTEM \u003d\u003d "block"、OPTIONS + \u003d "ignore_device"
このルールは、USBポートに接続されたブロックデバイスの認識を無効にします。 このルールは、組織のデータセキュリティとプライバシーを向上させるのに役立ちます。
2番目のIDEドライブのデバイスファイルに永続的な名前を割り当てますルールを別のドライブに適用する場合は、sdbを置き換えます。
USB経由で接続された2番目のUSBSCSI / IDEドライブを無視しますカーネル\u003d\u003d "sdb"、NAME \u003d "my_spare"
BUS \u003d\u003d "usb"、KERNEL \u003d\u003d "hdb"、OPTIONS + \u003d "ignore_device"
指定されたUSBマウスデバイスファイルにシンボリックリンクを追加しますSUBSYSTEM \u003d\u003d "input"、BUS \u003d\u003d "usb"、SYSFS(シリアル)\u003d\u003d "0000:00:1d.0"、SYMLINK + \u003d\u003d "MY-USB-MOUSE"
デバイスの製造元に基づいてデバイスのファイル名を変更するBUS \u003d\u003d "usb"、SYSFS(メーカー)\u003d\u003d "JetFlash"、NAME \u003d "UNIVERSE"
このルールは、USBフラッシュドライブの製造元がJetFlashの場合、デバイスファイル名を「UNIVERSE」に変更します。
特別なプログラムを使用してUSBブロックデバイスの使用を選択的に許可するBUS \u003d\u003d "usb"、SUBSYSTEM \u003d\u003d "block"、PROGRAM \u003d "/ bin / usbc.jar"、RESULT!\u003d "My"、OPTIONS + \u003d "ignore_device"
プログラムが「my」を出力した場合、デバイスを使用できます。それ以外の場合、デバイスは無視されます。
私たちの愛する街のスリーピングエリアの高層ビルの1つでの普通の朝を想像してみてください:トイレ、シャワー、ひげそり、お茶、歯磨き、猫のための水(または他の順序で)-そして仕事...すべてマシン上でためらうことなく。 冷水が冷水栓から流れ、温水が温水蛇口から流れる限り。 そして時々あなたは冷たいものを開け、そしてそこから-沸騰したお湯!! 11#^ *¿\u003e。
それを理解しましょう。
冷水供給または冷水供給
地元のポンプ場は、水道事業ネットワークから幹線に水を供給しています。 大きな供給パイプが家に入り、バルブで終わります。その後、水道メーターアセンブリがあります。
つまり、水道メーターユニットは、ストレーナーとメーターの2つのバルブで構成されています。
一部には追加のチェックバルブがあります
と水道メーターのバイパス。
水道メーターのバイパスは、メインの水道メーターが整備されている場合にシステムに供給することができるバルブを備えた追加のメーターです。 メーターの後、水は家のメインに供給されます
床ごとにアパートに水を導くライザーに沿って分配されます。
システム内の圧力はどれくらいですか?
9階
高さ9階までの家は、下から上に下が埋められます。 それら。 水道メーターから大きなパイプを通って、水はライザーを通って9階に流れます。 水道事業が良好な状態にある場合、下部ゾーンの入力には約4 kg / cm2があるはずです。 水柱10メートルごとに1キログラムの圧力降下を考慮すると、9階の居住者は約1キログラムの圧力を受けます。これは正常と見なされます。 実際には、古い家では、入力圧力はわずか3.6kgです。 そして、9階の住人は1kg / cm2よりもさらに低い圧力で満足しています
12〜20階
家が9階より高い場合、たとえば16階の場合、そのようなシステムは2つのゾーンに分割されます。 上と下。 下のゾーンでは同じ条件が維持され、上のゾーンでは圧力が約6kgに上昇します。 水を最上部まで上げて供給ラインに入れるために、水はライザーを通って10階に流れます。 20階以上の住宅では、給水は3つのゾーンに分けることができます。 このフロースキームでは、システム内の水は循環せず、背水の上に立っています。 高層マンションでは、平均して1〜4kgの圧力がかかります。 他にも意味はありますが、ここでは考慮しません。
給湯またはDHW
一部の低層ビルでは、お湯が同じスキームで接続されており、循環せずに背水の上に立っています。これは、お湯で蛇口を開くと、冷たく冷やされた水がしばらく流れることを説明しています。 16階建ての同じ家を利用する場合、そのような家ではDHWシステムの配置が異なります。 冷水と同様に、お湯も大きなパイプを通して家に供給され、メーターの後、それは家のメインに入ります
これは水を屋根裏部屋に上げ、そこでライザーに沿って分配され、リターンラインの一番下まで下降します。 ちなみに、DHWメーターは、家の中で失われた(消費された)水の量だけではありません。 これらのカウンターは、温度損失(ジジカラー)もカウントします
水がライザーの役割を果たすアパートの加熱されたタオル掛けを通過すると、温度が失われます。
この配置では、お湯は常に循環します。 蛇口をつけるとすぐにお湯が出てきます。 このようなシステムの圧力は約6〜7kgです。 循環を確保するために、流れで、戻りでわずかに低くなります。
循環のため、アパートのライザーに5〜6kgの圧力がかかります。 すぐに、2kgからの冷水と温水の圧力差がわかります。 これは、衛生器具が故障した場合に温水を冷水に押し込むことの本質です。 冷水よりも温水の方がまだ圧力が高いことに気付いた場合は、必ずコールドインレットにチェックバルブを取り付けてください。ホットインレットには、圧力を均等にするのに役立つ制御バルブをシステムに含めることができます。寒さで約1桁。 圧力調整器の設置例
ホットプラグ -ホットプラグ)-意味する用語 シャットダウン または 接続 電源を切ったり停止したりすることなく(システム)(HotPlug)、およびユニット全体を交換(再接続)することなく、動作中に(コンピュータ)システムに/への電子機器( ホットスワップ )。 ホットスワップの反対の用語もあります- コールドスワップ つまり、すべての(再)接続は、システムを停止して電圧(残留電位)を取り除いた後に行われます。機器はこの原則に従って次のように分割されます 許可する ホットスワップと 許可しない.
物語
以前は、交換に関連する操作中に接続するように設計された機器は、高価なシステムでのみ使用され、設計が難しいと考えられていました。 最近、このようなシステムは安価なコンピュータでも一般的になっています。
- PCMCIA、USB、FireWire、ファイバーチャネル、およびeSATA規格では、ホットスワップ可能であるため、ホットスワップ可能です。
このタイプのデバイスには、フラッシュドライブ、サーバー内のアレイ用のもの、ラップトップで使用されるPCI-X、PCI Express、ExpressCard(PCMCIA、PCカードとも呼ばれる)形式の拡張カード、さらには一部の電源装置などのハードドライブがあります。 .. - フルホットスワップSATAディスクインターフェイスをサポートせず、IDEプロトコルを完全にサポートしません(IDEはホットプラグをサポートします)。
システム設計
「オンザフライ」でハードウェアを交換するように設計されたコンピューターは、何らかの方法でデバイスが切断されていることを確認する必要があり、接続および切断時に電圧サージの影響を受けない電気回路も含まれている必要があります。 さらに、ソフトウェア部分は、デバイスとの通信が突然失われるように設計する必要があります。
一部のホットスワップ回路では、最初にデタッチコマンドを実行する必要があります。これにより、設計が簡素化されますが、デバイスが適切にデタッチされなかったり、エラーが発生したりすると、データの整合性が損なわれます。
より複雑な回路には冗長性のマージンがあり、デバイスが突然シャットダウンした場合にデータを簡単に回復できます。
「ホットスワップ」という用語には2つの意味があります。 一方では、電源を切らずにデバイスを切断または接続できることを意味します。 一方、接続時にデバイスが自動的に検出されることも意味します。 この用語の最初の意味は、RS-232、FireWire、および最も単純なSCSI実装に適用され、2番目の意味は、USB、FireWire、PCI Express、および複雑なSCSIバリアントに適用されます。
ソケットデザイン
外側の電源パッドは内部信号より長く作られています
最新のホットスワップ可能なデバイスのほとんどは、可動接点を使用しています。 取り付け部品に最初に接触するように、一方を他方より長くし、アース線を接続します。 残りの接点は短くなり、合計で最大3つの異なる長さにすることができます。 最初の接点と後続の接点の接続間の遅延は25〜250ミリ秒です。
供給回路は2段階で接続されます。最初の段階では、電流制限回路は長い接点を使用して接続され、次に短い接点(フル電源)を使用して接続されます。 接続に関係するすべての回路は、静電気から保護されています。
典型的な接続シーケンスの例を次に示します。
- 最長の接点は閉じています(アース)。 これにより、接続の電気的安全性と静電荷に対する保護が保証されます。
- 長いまたは中程度の供給前接点が閉じています。 入力電源回路は充電されています。
- 短い電源接点が接続されています。
- 接続は確立されたと見なされます。 電源初期化信号がONします。
- ソフトパワーオン回路はデバイスに電圧を供給します。
- 遅延は数十ミリ秒です。
- 電源回路がソフト接続を終了しました。 電源初期化信号がオフになります。
- デバイスはフル動作を開始します。
2番目、3番目のデバイスを接続すると、すでに接続されているデバイスの作業が中断される可能性があるため、複数のデバイスを接続することは特に困難です。 この現象に対処するために、出力回路またはデータ送信の一時的な論理シャットダウンでフィルターが使用されます。
ソフトウェアのホットプラグイン
「ホットプラグ」という用語はソフトウェアにも使用され、実行を停止せずにプログラムを変更する機能を意味します。 Lisp、Erlang、Smalltalkなど、この機能をサポートしているプログラミング言語はごくわずかです。 Java言語は、Java Platform Debugger Architecture(JPDA)の実行中にのみこの機能をサポートします。
1C v8のサブジェクト指向プログラミング言語は、プログラムの実行中にコードを変更する機能を提供します。 (http://v8.1c.ru/overview/release_8_1_5/administration.htmセクション「構成の一部の更新」)。 個々のモジュールのコンパイルはプログラムの実行時に行われ、モジュールが変更されると、セッションで再度コンパイルされるため、これは実際には「ホットプラグ」ではありません。変更を加えるには、セッションを再作成する必要があります。効果があり、このユーザーのみが対象です(他のユーザーは新しいセッションを再開する必要があります)。 バージョンv7では、この機能は、追加のソフトウェアツール(http://openconf.1cpp.ru/vk/turbomd/)と標準コマンド#LoadFromFile ....(フォームまたはレポートを再度開く必要がある)を使用する場合にも存在していました。 )。 一般に、インタプリタプログラミング言語(モジュール内にプログラムテキストを格納する)を使用する場合、ホットプラグはテキストを置き換えるだけで実装されます。
ホットプラグを表示するには、2つの異なる方法があります。 カーネルは、ホットプラグをハードウェア、カーネル、およびカーネルドライバー間の相互作用と見なします。 ユーザーは、ホットプラグを/ sbin / hotplugと呼ばれるプログラム内のカーネルとユーザースペース間の相互作用と見なします。 このプログラムは、ある種のホットプラグイベントがカーネルで発生したことをユーザースペースに通知するときにカーネルによって呼び出されます。
動的デバイス
「ホットプラグ」という用語の最も一般的に使用される意味は、ほとんどすべてのコンピュータシステムが、システムの電源を入れたときに表示または非表示になるデバイスを処理できるようになったという事実を説明するときです。 これは、プログラマーが起動時にすべてのデバイスをスキャンするだけでよく、マシン全体の電源を切ったときにデバイスが消えることを心配する必要がないことをプログラマーが知っていたほんの数年前のコンピューターシステムとは大きく異なります。 現在、USB、CardBus PCMCIA、IEEE1394、およびPCIホットプラグコントローラーの出現により、Linuxカーネルは、システムに追加またはシステムから削除されたハードウェアに関係なく、確実に動作できる必要があります。 これにより、デバイスドライバーの作成者は、事前の通知なしに突然制御不能になったデバイスを常に操作する必要があるため、追加の負担がかかります。
バスタイプごとに、デバイス損失の処理方法が異なります。 たとえば、PCI、CardBus、またはPCMCIAデバイスがシステムから削除された場合、これは通常、削除機能を通じてドライバーにこのアクションが通知される前に発生します。 これが発生する前に、すべてのPCIバス読み取りがすべてのビットを設定します。 つまり、ドライバーはPCIバスから読み取ったデータの値を常にチェックし、0xff値を適切に処理できる必要があります。
この例は、USB 2.0(高速)コントローラーカード用のPCIドライバーであるdrivers / usb / host /ehci-hcd.cにあります。 コントローラーボードがシステムから取り外されたことを検出するために、メインハンドシェイクループに次のコードがあります。
結果\u003d readl(ptr);
if(result \u003d\u003d〜(u32)0)/ *カードが削除されました* /
-ENODEVを返します。
USBドライバーの場合、USBドライバーが関連付けられているデバイスがシステムから削除されると、デバイスに送信された保留中のすべてのurbが最初に-ENODEVエラーで失敗します。 ドライバーはこのエラーを認識し、保留中のI / Oがある場合は、それをすべて適切にクリーンアップする必要があります。
ホットプラグデバイスは、マウス、キーボード、ネットワークカードなどの従来のデバイスに限定されません。 現在、プロセッサ全体とメモリカードの取り外しと追加をサポートしているシステムはたくさんあります。 幸い、Linuxカーネルはこれらの基本的な「システム」デバイスの追加と削除を適切に処理するため、個々のデバイスドライバーはこれらのことに注意を払う必要はありません。
/ Sbin /ホットプラグユーティリティ
この章で前述したように、デバイスがシステムに追加またはシステムから削除されると、「ホットプラグイベント」が生成されます。 これは、カーネルがユーザースペースプログラム/ sbin / hotplugを呼び出すことを意味します。 このプログラムは通常、/ etc / hotplug.d /ディレクトリツリーにある他のプログラムのリストに実行を渡すだけの非常に小さなbashスクリプトです。 ほとんどのLinuxディストリビューションでは、このスクリプトは次のようになります。
DIR \u003d "/ etc / hotplug.d"
"$(DIR)/ $ 1 /"*。hotplug"$(DIR)/" default/*。hotplug; 行う
[-f $ I]の場合; その後
テスト-x $ I && $ I $ 1;
完了
出口1
つまり、スクリプトは、このイベントに関係する可能性のある.hotplugサフィックスを持つすべてのプログラムを検索して呼び出し、カーネルによって設定されたさまざまな環境変数を渡します。 / sbin / hotplugスクリプトの動作の詳細については、プログラムのコメントとhotplug(8)のマニュアルページを参照してください。
前述のように、/ sbin / hotplugは、kobjectが作成または破棄されたときに呼び出されます。 ホットプラグは、このイベントの名前を表す1つのコマンドライン引数を使用して呼び出されます。 メインカーネルと特定のサブシステムは、何が起こったのかに関する情報を含む一連の環境変数(以下を参照)の設定にも関与します。 これらの変数は、ホットプラグプログラムで使用され、カーネルで何が起こったか、および実行する必要のある特別なアクションがあるかどうかを判断します。
/ sbin / hotplugに渡されるコマンドライン引数は、kobjectに割り当てられたksetによって決定される、このhotplugイベントに関連付けられた名前です。 この名前は、この章で前述したksetのhotplug_ops構造体の一部であるname関数を呼び出すことで設定できます。 この関数が存在しないか、呼び出されたことがない場合は、kset自体の名前が使用されます。
/ sbin / hotplugプログラムに常に設定されるデフォルトの環境変数は次のとおりです。
アクション
指定されたオブジェクトが作成されたばかりか破棄されたかに応じて、行add(追加)またはremove(削除)。
DEVPATH
現在作成または破棄されているkobjectを指すsysfsファイルシステム内のディレクトリへのパス。 sysfsファイルシステムのマウントポイントはこのパスに追加されないため、その定義はユーザースペースプログラムを作成するために残されていることに注意してください。
シーケンス番号
このホットプラグイベントのシーケンス番号。 シーケンス番号は、ホットプラグイベントが生成されるたびに増加する64ビットの番号です。 これにより、ユーザースペースプログラムが順不同で実行される可能性があるため、ユーザースペースはカーネルが生成する順序でホットプラグイベントをソートできます。
サブシステム
上記と同じ文字列がコマンドライン引数として渡されます。
バス関連のデバイスがシステムに追加またはシステムから削除されると、さまざまなバスサブシステムが独自の環境変数を/ sbin / hotplug呼び出しに追加します。 これは、そのバスに割り当てられたstruct kset_hotplug_opsで指定されたホットプラグコールバックで行います(「ホットプラグ操作」セクションで説明されています)。 これにより、ユーザースペースは、バス上で検出されたデバイスを制御するために必要となる可能性のある必要なモジュールを自動的にロードできるようになります。 これは、さまざまなバスタイプとそれらが/ sbin / hotplug呼び出しに追加する環境変数のリストです。
IEEE1394(FireWire)
IEEE1394バス上のすべてのデバイス(FireWireとも呼ばれます)には、/ sbin / hotplugの名前パラメーターがあり、SUBSYSTEM環境変数はieee1394に設定されています。 Ieee1394サブシステムは、常に次の4つの環境変数も追加します。
VENDOR_ID
IEEE1394デバイスの24ビットベンダーID。
MODEL_ID
IEEE1394デバイスの24ビットモデル識別子。
GUID
このデバイスの64ビットGUID。
SPECIFIER_ID
このデバイスのプロトコル仕様の所有者を識別する24ビット値
バージョン
このデバイスのプロトコル仕様のバージョンを識別する値。
通信網
デバイスがカーネルに登録または登録解除されると、すべてのネットワークデバイスがホットプラグメッセージを生成します。 / Sbin / hotplugにはnameパラメーターがあり、SUBSYSTEM環境変数はnetに設定されており、次の環境変数のみを追加します。
インターフェース
カーネルから登録または登録解除されたインターフェースの名前。 例はloとeth0です。
PCI
PCIバス上のすべてのデバイスには名前パラメーターがあり、SUBSYSTEM環境変数はpciに設定されています。 PCIサブシステムは、常に次の4つの環境変数も追加します。
PCI_CLASS
このデバイスのPCIクラス番号(16進数)。
PCI_ID
このデバイスのベンダーIDとPCIデバイスID(16進数)は、ベンダー:デバイス形式で連結されています。
PCI_SUBSYS_ID
subsys_vendor:subsys_deviceの形式で組み合わされたベンダーおよびPCIサブシステム識別子。
PCI_SLOT_NAME
ドメイン:バス:スロット:関数の形式でカーネルによってデバイスに与えられたPCIスロットの「名前」。 例は0000:00:0d.0です。
入力
すべての入力デバイス(マウス、キーボード、ジョイスティックなど)について、デバイスがカーネルに追加されたりカーネルから削除されたりすると、ホットプラグメッセージが生成されます。 / sbin / hotplugオプションとSUBSYSTEM環境変数が入力に設定されます。 入力サブシステムは、常に次の環境変数も追加します。
製品
先行ゼロなしの16進表記の値を次の形式でリストする複数値の文字列 バスタイプ:ベンダー:製品:バージョン.
デバイスがそれらをサポートしている場合、次の環境変数が存在する可能性があります。
名前
デバイスによって指定された入力デバイスの名前。
PHYS
入力サブシステムがこのデバイスに与えたデバイスの物理アドレス。 デバイスが接続されているバスの場所に応じて、安定している必要があります。
それらはすべて入力デバイス記述子から取得され、特定の入力デバイスがそれをサポートしている場合は適切な値に設定されます。
USB
USBバス上のすべてのデバイスには名前パラメーターがあり、SUBSYSTEM環境変数はusbに設定されています。 USBサブシステムは、常に次の環境変数も追加します。
製品
idVendor / idProduct / bcdDeviceの形式の文字列
タイプ
形式の文字列 bDeviceClass / bDeviceSubClass / bDeviceProtocolこれらのUSBデバイス依存フィールドを定義します。
bDeviceClassが0に設定されている場合、次の環境変数も設定されます。
インターフェース
形式の文字列 bInterfaceClass / bInterfaceSubClass / bInterfaceProtocolこれらのUSBデバイス依存フィールドを定義します。
CONFIG_USB_DEVICEFSカーネルビルドオプションが選択されている場合、usbfsファイルシステムがカーネルにビルドされることを選択すると、次の環境変数も設定されます。
端末
デバイスがusbfsファイルシステムのどこにあるかを示す文字列。 この文字列の形式は / proc / bus / usb / USB_BUS_NUMBER / SB_DEVICE_NUMBERここで、USB_BUS_NUMBERは、デバイスが接続されているUSBバスの3桁の番号であり、USB_DEVICE_NUMBERは、このUSBデバイスのカーネルによって割り当てられた3桁の番号です。
SCSI
SCSIデバイスが作成されるか、カーネルから削除されると、すべてのSCSIデバイスがホットプラグイベントを生成します。 / Sbin / hotplugにはnameパラメーターがあり、システムに追加またはシステムから削除されるSCSIデバイスごとにSUBSYSTEM環境変数がscsiに設定されます。 SCSIシステムによって追加の環境変数は追加されませんが、指定されたデバイスにSCSIドライバー(フロッピー、テープ、通常など)をロードする必要があることを決定できる特別なSCSIスクリプトがユーザースペースにあるため、ここで説明します。 SCSI。
ノートブックドッキングステーション
プラグアンドプレイラップトップドッキングステーションが実行中のLinuxシステムに追加または削除されると(ラップトップをドッキングステーションに接続するか削除することにより)、ホットプラグイベントが生成されます。 / Sbin / hotplugにはnameパラメーターがあり、SUBSYSTEM環境変数はdockに設定されています。 他の環境変数は設定されていません。
S / 390およびzSeries
S / 390アーキテクチャーでは、チャネル・バス・アーキテクチャーはさまざまなハードウェアをサポートしており、それぞれがLinux仮想システムに追加またはLinux仮想システムから削除されると/ sbin / hotplugイベントを生成します。 これらのデバイスはすべて、/ sbin / hotplugの名前パラメーターを持ち、SUBSYSTEM環境変数はdasdに設定されています。 他の環境変数は設定されていません。
/ sbin / hotplugを使用する
Linuxカーネルがカーネルに追加またはカーネルから削除されたすべてのデバイスに対して/ sbin / hotplugを呼び出してこれを利用するようになったため、ユーザースペースに非常に便利なツールが多数作成されました。 最も人気のあるツールの2つは、Linuxホットプラグスクリプトとudevです。
Linuxホットプラグスクリプト
Linuxホットプラグスクリプトは、/ sbin / hotplug呼び出しの最初のユーザーとして開始されました。 これらのスクリプトは、カーネルが設定したさまざまな環境変数を調べて、検出したばかりのデバイスを記述し、そのデバイスに一致するカーネルモジュールを見つけようとします。
前述のように、ドライバーがMODULE_DEVICE_TABLEマクロを使用すると、プログラムdepmodがこの情報を取得し、にあるファイルを作成します。 /lib/module/KERNEL_VERSION/modules.*map..。 *記号は、ドライバーがサポートするバスのタイプによって異なります。 現在、モジュラーマップファイルは、PCI、USB、IEEE1394、INPUT、ISAPNP、およびCCWサブシステムをサポートするデバイスで動作するドライバー用に作成されています。
ホットプラグスクリプトは、これらのモジュラーマップテキストファイルを使用してモジュールを定義し、カーネルによって最近検出されたデバイスをサポートするためにモジュールをロードしようとします。 それらはすべてのモジュールをロードし、カーネルがどのモジュールが最も適しているかを選択できるようにするために、最初の一致で停止しません。 これらのスクリプトは、デバイスを削除するときにすべてのモジュールをアンロードするわけではありません。 これを行おうとすると、削除されたデバイスドライバーによっても制御されているデバイスを誤ってオフにする可能性があります。
modprobeがモジュールマップファイルを必要とせずにモジュールからMODULE_DEVICE_TABLE情報を直接読み取ることができるようになったため、ホットプラグスクリプトをmodprobeの小さなラッパーに減らすことができます。
udev
カーネルで統一されたドライバーモデルを作成する主な理由の1つは、ユーザースペースが/ devツリーを動的に管理できるようにすることでした。 これは、以前はdevfs実装によってユーザースペースで行われていましたが、アクティブなメンテナーの不足と回復不能なベースラインバグのために、このコードベースは徐々に腐敗しています。 いくつかのカーネル開発者は、すべてのデバイス情報がユーザースペースにエクスポートされれば、/ devツリーの必要なすべての管理を実行できることに気づきました。
devfsには、その設計にいくつかの非常に重大な欠陥があります。 それをサポートするために各デバイスドライバーを変更する必要があり、デバイスドライバーはそれが配置される/ devツリー内の名前と場所を指定する必要があります。 また、動的なメジャー番号とマイナー番号を適切に処理しないため、デバイスの名前付けポリシーがユーザースペースではなくカーネルに属するように強制されます。 Linuxカーネル開発者は、カーネルにポリシーを設定することを本当に嫌っています。devfsの命名ポリシーはLinux Standard Baseに準拠していないため、これは本当に心配です。
Linuxカーネルが巨大なサーバーにインストールされ始めて以来、多くのユーザーは非常に多くのデバイスを管理する方法の問題に直面しています。 10,000を超える一意のデバイスのディスクアレイは、ディスクアレイ内のどこに配置されていても、またはカーネルによって検出されたときに、各ディスクに常に同じ正確な名前を付けることを保証するための非常に難しいタスクを提示します。 これは、デスクトップユーザーが2台のUSBプリンターをシステムに接続しようとして、/ dev / lpt0として知られるプリンターが変更されて別のプリンターに割り当てられないことを確認できなかったことに苦しむのと同じ問題です。システムの再起動の。
このようにして、udevが作成されました。 これは、sysfsを介してユーザースペースにエクスポートされたすべてのデバイス情報と、デバイスが追加または削除されたことを/\u200b\u200b sbin / hotplugを介して通知することに依存しています。 デバイスに付ける名前などのポリシー決定は、カーネルの外部のユーザースペースで指定できます。 これにより、ネーミングポリシーがカーネルから削除され、各デバイスのネーミングの柔軟性が高まります。
udevの使用とその構成方法の詳細については、ディストリビューションのudevパッケージに含まれているドキュメントを参照してください。
udevが正しく動作するために必要なのは、ドライバーによって制御されるデバイスに割り当てられたメジャー番号とマイナー番号がsysfsを介してユーザースペースにエクスポートされるようにすることだけです。 サブシステムを使用してメジャー番号とマイナー番号を割り当てるドライバーの場合、これはサブシステムによって既に実行されており、ドライバーは何も実行しないでください。 これを行うサブシステムの例は、tty、misc、usb、input、scsi、block、i2c、network、およびframebufferサブシステムです。 ドライバーがcdev_initまたは非推奨のregister_chrdev関数の呼び出しを通じてメジャー番号とマイナー番号の取得を独自に処理する場合、udevが正しく機能するようにドライバーを変更する必要があります。
udevは、sysfsの/ class /ツリーでdevという名前のファイルを探し、/ sbin / hotplugインターフェースを介してカーネルによって呼び出されたときに、特定のデバイスに割り当てられているメジャー番号とマイナー番号を判別します。 デバイスドライバーは、制御するデバイスごとにそのようなファイルを作成するだけで済みます。 通常、これを行う最も簡単な方法はclass_simpleインターフェースです。
「class_simpleインターフェース」のセクションで説明したように、class_simpleインターフェースを使用する最初のステップは、class_simple_create関数を呼び出してstructclass_simpleを作成することです。
static struct class_simple * foo_class;
foo_class \u003d class_simple_create(THIS_MODULE、 "foo");
if(IS_ERR(foo_class))(
Printk(KERN_ERR "fooクラスの作成中にエラーが発生しました。\\ N");
Gotoエラー;
このコードは、sysfsの/ sys / class / fooにディレクトリを作成します。
第3章で説明されているように、ドライバーが新しいデバイスを見つけてそれにマイナー番号を割り当てるたびに、ドライバーはclass_simple_device_add関数を呼び出す必要があります。
class_simple_device_add(foo_class、MKDEV(FOO_MAJOR、マイナー)、NULL、 "foo%d"、マイナー);
このコードにより、fooNという名前のサブディレクトリが/ sys / class / fooに作成されます。ここで、Nはこのデバイスのマイナー番号です。 このディレクトリdevに1つのファイルが作成されます。これは、udevがデバイスのデバイスノードを作成するために必要なものです。 ドライバーがデバイスから解放され、それに割り当てられたマイナー番号を破棄する場合、そのデバイスのsysfsエントリを削除するには、class_simple_device_removeを呼び出す必要があります。
class_simple_device_remove(MKDEV(FOO_MAJOR、マイナー));
後で、ドライバー全体がシャットダウンしたときに、class_simple_createを呼び出して最初に作成したクラスを削除するには、class_simple_destroyを呼び出す必要があります。
class_simple_destroy(foo_class);
class_simple_device_addを呼び出して作成されるdevファイルは、メジャー番号とマイナー番号で構成され、次のように区切られます。 クラスディレクトリ内のサブシステムに他のファイルを公開するためにドライバがclass_simpleインターフェイスを使用したくない場合は、print_dev_t関数を使用して、各デバイスのメジャー番号とマイナー番号を正しくフォーマットします。
住宅が正常に機能するためには、給水システムの設置が不可欠です。 その有能なデバイスは、タイムリーな供給と十分な水圧を保証します。 この記事では、アパートの給湯方式、接続タイプ、およびその機能について詳しく説明します。
アパートの給水の特徴は何ですか?
階数の多い建物に水を供給することは非常に困難です。 結局のところ、家は独立したバスルームと配管設備を備えた多くのアパートで構成されています。 言い換えれば、アパートの給水計画は、個別の配管、圧力調整器、フィルター、および計量装置を備えた一種の複合体です。
ほとんどの場合、高層ビルの居住者は中央給水を使用します。 給水システムの助けを借りて、それは特定の圧力の下で個々の衛生器具に供給されます。 水はしばしば塩素処理で処理されます。
中央給水システムの構成
高層ビルの集中給水計画は、配水網、取水施設、処理プラントで構成されています。 アパートに入る前に、水はポンプ場から貯水池まで長い道のりを行きます。 洗浄と消毒の後でのみ、水は配水網に送られます。 後者の助けを借りて、水は電気器具や機器に供給されます。 多階建ての建物の給湯の中央回路のパイプは、銅、金属-プラスチック、鋼で作ることができます。
後者のタイプの材料は、現代の建物では実際には使用されていません。
給水スキームの種類
給水システムには次の3つのタイプがあります。
- コレクタ;
- 一貫性のある;
- 組み合わせ(混合)。
最近、アパートで多くの配管設備が見つかると、彼らは コレクタ配線図 ..。 これは、すべてのデバイスが正常に機能するための最良のオプションです。 コレクタータイプの給湯方式では、さまざまな接続ポイントでの圧力降下が排除されます。 これがこのシステムの主な利点です。
スキームをより詳細に検討すると、配管設備を本来の目的に使用しても問題はないと結論付けることができます。 接続の本質は、個々の水消費者が冷水および温水供給ライザーのコレクターに個別に接続されていることです。 配管は分岐が少ないため、漏れの可能性は非常に低いです。 このような高層ビルの給水計画は維持が容易ですが、設備のコストはかなり高くなります。
専門家によると、給湯器回路には、より複雑な衛生器具の設置が必要です。 ただし、これらのマイナス面はそれほど重要ではありません。特に、コレクタ回路には多くの利点があるという事実を考慮すると、たとえば、隠しパイプの設置や機器の個々の特性を考慮する必要があります。
シーケンシャル温水回路 立体駐車場は配線の最も簡単な方法です。 このようなシステムは時間の経過とともにテストされ、ソ連の時代に運用が開始されました。 その装置の本質は、冷水と温水の供給パイプラインが互いに並行して実行されることです。 エンジニアは、1つのバスルームと少量の配管設備を備えたアパートでこのシステムを使用することをお勧めします。
人々は、このような給湯計画を高層ビルのティーと呼んでいます。 つまり、幹線道路からの分岐があり、Tシャツで相互に接続されています。 インストールの容易さと消耗品の節約にもかかわらず、このスキームにはいくつかの主な欠点があります。
- 漏れが発生した場合、損傷した領域を見つけるのは困難です。
- 別の衛生器具に水を供給できない。
- 破損した場合のパイプへのアクセスの難しさ。
アパートの給湯。 スキーム
パイプのレイアウトは、温水と冷水の供給のライザーへの2つのタイプに分けられます。 それらは簡単に冷水供給と温水供給と呼ばれます。 アパートの給湯システムは特に注目に値する。 DHWネットワーク図は、下部と上部の2種類の配線で構成されています。 ループバック配線は、配管を高温に保つためによく使用されます。 ドローオフがないにもかかわらず、重力によって水がリング内を循環します。 ライザーでは、冷却してヒーターに入ります。 高温の水がパイプに供給されます。 これは、クーラントの継続的な循環が行われる方法です。
行き止まりの高速道路も珍しいことではありませんが、ほとんどの場合、産業施設のユーティリティルームや低層の小さな住宅に見られます。 取水に一貫性がないことが計画されている場合は、循環パイプラインが使用されます。 エンジニアは、4階建て以下のアパートの建物(スキームについては前述)で給湯を使用することをお勧めします。行き止まりのライザーを備えたパイプラインは、ホステル、療養所、ホテルにもあります。 行き止まりのネットワークのパイプは金属の消費量が少ないため、冷却が速くなります。
DHWネットワークには、水平メインパイプラインと配水ライザーが含まれます。 後者は、個々のオブジェクト(アパート)に配管を提供します。 給湯器は、配管設備のできるだけ近くに設置されています。
メインパイプの長さが長い建物の場合、循環と供給パイプラインを介してループするスキームが使用されます。 前提条件は、循環と一定の水交換を維持するためのポンプの設置です。
2パイプDHWスキーム-写真07
現代の建築業者やエンジニアは、2パイプのDHWシステムの使用にますます頼っています。 ポンプが戻りラインから水を取り、ヒーターに供給するという動作原理です。このようなパイプラインは金属消費量が多く、消費者にとって最も信頼できると考えられています。