Go to main content
マニュアルページ セク ション 1M: シ ステム管理コマン ド

印刷ビューの終了

更新: 2016年12月6日
 
 

add_drv(1M)

名前

add_drv - システムへの新しいデバイスドライバの追加

形式

add_drv [-b basedir] [-c class_name] 
     [-i 'identify_name...'] [-m 'permission','...'] 
     [-p 'policy'] [-P privilege] [-n] [-f] [-u] [-v] device_driver

説明

add_drv コマンドは、新たにインストールされたデバイスドライバについてシステムに通知するために使われます。

システム上の各デバイスには名前が関連付けられています。この名前は、デバイスの name プロパティーによって表されます。同様に、デバイスにはドライバ名のリストが関連付けられていることもあります。このリストは、デバイスの compatible プロパティーによって表されます。

システムは、各デバイスの name プロパティーと compatible プロパティー (存在する場合) の内容を調べることで、追加されるドライバによってどのデバイスが管理されるのかを判断します。name プロパティーの値が追加されるドライバと一致しない場合は、compatible プロパティーの各エントリが順番に試され、一致するエントリが見つかるか、compatible プロパティーのエントリがなくなるまで行われます。

場合によっては、新しいドライバを追加する際に再構成ブート (boot-r) が必要になることがあります。「注意事項」のセクションを参照してください。

エイリアスに数字が含まれている場合は、エイリアスを二重引用符で囲む必要があることがあります。「使用例」を参照してください。

/etc/minor_perm ファイル

add_drv および update_drv(1M) は、/etc/minor_perm ファイルを読み取ってアクセス権の情報を取得します。指定されたアクセス権は、ドライバにバインドされたデバイスが接続されるときに作成される、一致するマイナーノードに適用されます。マイナーノードのアクセス権は、chmod(1) によって手動で変更できます。このようなノードの場合、指定されたアクセス権が適用されて、add_drv または update_drv(1M) によって指定されたデフォルトのアクセス権が置き換えられます。

/etc/minor_perm ファイルの形式は次のとおりです。

name:minor_name permissions owner group

minor_name にはマイナーノードの実際の名前を指定することも、いくつかのマイナーノードを表すシェルのメタキャラクタを含めることもできます (sh(1) を参照)。

例:

sd:* 0640 root sys
zs:[a-z],cu 0600 uucp uucp
mm:kmem 0640 root bin

最初の行では、sd ノードによってエクスポートされるすべてのデバイスに、所有者 root、グループ sys を持つ 0640 アクセス権が設定されます。2 番目の行では、zs ドライバによってエクスポートされる a,cu や z,cu などのデバイスに、所有者 uucp、グループ uucp を持つ 0600 アクセス権が設定されます。3 番目の行では、mm ドライバによってエクスポートされる kmem デバイスに、所有者 root、グループ bin を持つ 0640 アクセス権が設定されます。

postinstall スクリプトからの add_drv の実行

パッケージの postinstall スクリプトのコンテキスト内から add_drv を実行するときは、そのパッケージがシステムイメージに追加されるのか、実行中のシステムに追加されるのかについて考慮する必要があります。パッケージをシステムイメージにインストールする場合、BASEDIR 変数はイメージのベースディレクトリを指します。この状況では、–b $BASEDIR を指定して add_drv を起動するようにしてください。これにより、add_drv はイメージのシステムファイルの更新だけを行います。ドライバを操作可能にするためには、システムまたはクライアントをリブートする必要があります。

パッケージが実行中のシステムそのものにインストールされる場合、前述の場合と同様に、システムファイルを更新する必要があります。ただし、リブートを行わなくても新しいドライバが存在することを実行中のカーネルに通知することができます。このためには、postinstall スクリプトが –b オプションなしで add_drv を起動する必要があります。したがって、add_drv を起動する postinstall スクリプトを次のように記述してください。

if [ "${BASEDIR:=/}" = "/" ]
then
        ADD_DRV="add_drv"
else
        ADD_DRV="add_drv -b ${BASEDIR}"
fi
$ADD_DRV [<options>] <driver>

あるいは、次のように記述してください。

if [ "${BASEDIR:=/}" != "/" ]
then
         BASEDIR_OPT="-b $BASEDIR"
fi
         add_drv $BASEDIR_OPT [<options>] <driver>

–b オプションについては、このあと説明します。

オプション

–b basedir

ドライバを、add_drv を実行しているシステムにインストールするのではなく、basedir というルートディレクトリを持つシステムにインストールします。このオプションは通常、pkgadd コマンドを実行しているシステムにパッケージがインストールされない場合に、パッケージのインストール後処理スクリプトで使われます。basedir をルートディレクトリとして使用するシステムは、リブートを行なってドライバのインストールを完了する必要があります。


注 - –b オプションを使って、非大域ゾーンのルートファイルシステムを参照しないでください。この操作によって、大域ゾーンのファイルシステムを損傷したり、大域ゾーンのセキュリティを損ねたり、非大域ゾーンのファイルシステムを損傷する可能性があります。zones(5) を参照してください。
–c class_name

システムに追加されるドライバによってクラス class_name がエクスポートされます。

–f

通常、システムへのドライバの設定を完了するために再構成ブート (boot-r) が必要な場合、add_drv はドライバを追加しません。強制 (force) フラグは、再構成ブート (boot-r) が必要な場合でも、add_drv に強制的にドライバを追加させます。–v フラグを参照してください。

–i 'identify_name'

ドライバ device_driver のエイリアスをスペースで区切ったリスト。

–m 'permission'

device_driver のためにシステムが作成したデバイスノードのファイルシステムアクセス権を指定します。

–n

device_driver のロードや接続を試みず、device_driver のシステム構成ファイルの変更だけを行います。

–p 'policy'

追加のデバイスセキュリティーポリシーを指定します。

デバイスセキュリティーポリシーは、スペースで区切られたいくつかのトークンから構成されます。


{minorspec {token=value}+}+

minorspec は、マイナーデバイスの単純なワイルドカードパターンです。1 つの * はすべてのマイナーデバイスに適合します。パターンには、* を 1 つしか指定できません。

パターンは、次の順序で照合されます。

  • ワイルドカードのないエントリ

  • ワイルドカードのあるエントリ (長いワイルドカードから先に照合される)

定義されるトークンは、read_priv_set と write_priv_set です。read_priv_set は、読み取り用にデバイスを開くときに呼び出し側プロセスの実効セットで表明される必要がある特権を定義します。write_priv_set は、書き込み用にデバイスを開くときに呼び出し側プロセスの実効セットで表明される必要がある特権を定義します。privileges(5) を参照してください。

定義されるトークンは、read_priv_set、write_priv_set、および tpd_member です。read_priv_set は、読み取り用にデバイスを開くときに呼び出し側プロセスの実効セットで表明される必要がある特権を定義します。write_priv_set は、書き込み用にデバイスを開くときに呼び出し側プロセスの実効セットで表明される必要がある特権を定義します。tpd_member は、不変な大域ゾーンでのみ使用されます。tpd_member が「true」に設定されたデバイスは、不変な大域ゾーンでは読み取り専用になります。これは、write_priv_set=ALL であるようなデバイスではデフォルトで有効化されます。privileges(5) を参照してください。

マイナーデバイス仕様 (minorspec) を指定しない場合は、* として解釈されます。

–P 'privilege'

ドライバによって使用される追加の特権をコンマで区切って指定します。デバイスのポリシーに含まれる特定の特権を使用することもできます。

–u

ドライバをシステムに追加し、あとで devfsadm(1M) –u を使用して構成するためにアクティブではない状態のままにします。–u の動作が –n と異なるのは、–n はシステムファイルを更新するだけで、ドライバを接続するためにはリブートが必要になる点です。–u を指定して追加されたドライバは、devfsadm –u を実行することにより、リブートせずに接続できます。ドライバライターは、ドライバのこの動作について検証するようにしてください。その他の考慮事項については、「注意事項」を参照してください。–u オプションは –n または –b と同時に指定できません。

–v

冗長フラグを指定すると、add_drv はシステムへのドライバの構成の成功または失敗に関する追加情報を提供します。「使用例」のセクションを参照してください。

例

使用例 1 SUNW Example ドライバをシステムに追加する

次の例では、SUNW,alias というエイリアス名を使って、SUNW,example ドライバを 32 ビットシステムに追加します。ドライバは /usr/kernel/drv にすでにコピーされているものとします。


example# add_drv –m '* 0666 bin bin','a 0644 root sys' \
      –p 'a write_priv_set=sys_config  * write_priv_set=none' \
      –i 'SUNW,alias' SUNW,example

SUNW,example ドライバのためにシステムが作成する各マイナーノードは、アクセス権 0666 が与えられ、グループ bin のユーザー bin によって所有されます。ただし、マイナーデバイス a は例外であり、こちらはグループ sys のユーザー root によって所有され、アクセス権 0644 が与えられます。指定されたデバイスポリシーでは、すべてのマイナーモードを開くために追加の特権は必要ありませんが、マイナーデバイス a は例外であり、こちらは書き込み用にデバイスを開くときに sys_config 特権が必要です。

使用例 2 ドライバをクライアント /export/root/sun1 に追加する

次の例では、ドライバをクライアント /export/root/sun1 に追加します。クライアントマシン sun1 がリブートされると、ドライバがインストールされてロードされます。2 番目の例では、最初の例と同じ結果が得られますが、変更がディスクレスクライアントsun1 上に置かれ、ドライバをインストールするためにはクライアントをリブートする必要がある点が異なります。

example# add_drv –m '* 0666 bin bin','a 0644 root sys' \
        –i 'SUNW,alias' -b /export/root/sun1 \
	SUNW,example

前述の –b オプションの説明に含まれる注意事項 (このオプションを Solaris ゾーン機能とともに使用する場合の注意事項が示されている) を参照してください。

使用例 3 既存のドライバによってすでに管理されているデバイスに対してドライバを追加する

次の例は、既存のドライバによってすでに管理されているデバイスに対して新しいドライバが追加される場合を示しています。デバイスがドライバ dumb_framebuffer によって現在管理されているとします。このデバイスの name および compatible プロパティーは、次のとおりです。

name="display"
compatible="whizzy_framebuffer", "dumb_framebuffer"

whizzy_framebuffer ドライバを追加するために add_drv を使用した場合は、次のような結果になります。

example# add_drv whizzy_framebuffer
Error: Could not install driver (whizzy_framebuffer)
Device managed by another driver.

–v フラグを指定した場合は、次のような結果になります。

example# add_drv -v whizzy_framebuffer
Error: Could not install driver (whizzy_framebuffer)
Device managed by another driver.
Driver installation failed because the following
entries in /devices would be affected:

        /devices/iommu@f,e0000000/sbus@f,e0001000/display[:*]
        (Device currently managed by driver "dumb_framebuffer")

The following entries in /dev would be affected:

        /dev/fbs/dumb_framebuffer0

–v および –f フラグを指定した場合は、ドライバが追加されて、次のような結果になります。

example# add_drv -vf whizzy_framebuffer
A reconfiguration boot must be performed to complete the
installation of this driver.

The following entries in /devices will be affected:

        /devices/iommu@f,e0000000/sbus@f,e0001000/display[:*]
        (Device currently managed by driver "dumb_framebuffer"

The following entries in /dev will be affected:

        /dev/fbs/dumb_framebuffer0

前述の例は、現在のところ、汎用デバイス名をエクスポートするデバイスにのみ当てはまります。

使用例 4 ドライバエイリアスを指定する際に二重引用符を使用する

次の例では、数字が含まれるドライバエイリアスを指定する際に二重引用符を使用しています。

example# add_drv -i '"pci10c5,25"' smc

終了ステータス

add_drv は、成功すると 0 を返し、失敗すると 1 を返します。

ファイル

/kernel/drv

32 ビットブートデバイスドライバ

/kernel/drv/sparcv9

64 ビット SPARC ブートデバイスドライバ

/kernel/drv/amd64

64 ビット x86 ブートデバイスドライバ

/usr/kernel/drv

潜在的にプラットフォーム間で共有できる他の 32 ビットドライバ

/usr/kernel/drv/sparcv9

潜在的にプラットフォーム間で共有できる他の 64 ビット SPARC ドライバ

/usr/kernel/drv/amd64

潜在的にプラットフォーム間で共有できるほかの 64 ビット x86 ドライバ

/platform/`uname -i`/kernel/drv

32 ビットプラットフォーム依存のドライバ

/platform/`uname -i`/kernel/drv/sparcv9

64 ビット SPARC プラットフォーム依存のドライバ

/platform/`uname -i`/kernel/drv/amd64

64 ビット x86 プラットフォーム依存のドライバ

/etc/driver_aliases

ドライバエイリアスファイル

/etc/driver_classes

ドライバクラスファイル

/etc/minor_perm

マイナーノードのアクセス権

/etc/name_to_major

メジャー番号のバインディング

/etc/security/device_policy

デバイスポリシー

/etc/security/extra_privs

デバイス特権

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
system/core-os

関連項目

boot(1M), chmod(1), devfsadm(1M), kernel(1M), modinfo(1M), rem_drv(1M), update_drv(1M), driver.conf(4), system(4), attributes(5), privileges(5), tpd(5), devfs(7FS), ddi_create_minor_node(9F)

Oracle Solaris 11.2 デバイスドライバの記述

注

別のドライバによってすでに管理されているデバイスに対してドライバを追加することが可能です。その場合、追加されるドライバは、デバイスの compatible リストの現在のドライバの前に表示されます。このような場合は、再構成ブート (boot-r) が必要です (boot(1M) および kernel(1M) を参照)。再構成ブート (boot-r) のあとは、/dev 内のデバイスリンクと、これらのファイルへの参照が無効になる場合があります (–v フラグを参照)。ドライバのインストールを完了するために再構成ブート (boot-r) が必要になる場合、–f オプションを指定しないかぎり、add_drv は失敗します。「使用例」のセクションの「例 3」を参照してください。

デバイスポリシーの導入によって、一部のドライバのマイナーアクセス権が変更されたり、デバイスポリシーがインストールされたりします。一般的なネットワークドライバには、次のデバイスポリシーを使用するようにしてください。


add_drv -p 'read_priv_set=net_rawaccess\
   write_priv_set=net_rawaccess' -m '* 666 root sys'\
   mynet

このドキュメントは、API を構成するものではありません。/etc/minor_perm、/etc/name_to_major、/etc/driver_classes、および /devices は、将来のリリースで削除されたり、内容や解釈が異なっていたりすることがあります。ここに記載された通知は、この通知のない他のドキュメントが API を構成していることを意味するものではありません。

/etc/minor_perm は、add_drv(1M)、rem_drv(1M)、または update_drv(1M) によってのみ更新できます。

現在のバージョンの add_drv は、コマンド行から使用する場合、別名を指定するための二重引用符の使用は省略できます。ただし、パッケージスクリプトから add_drv を使用する場合は、二重引用符を引き続き使用して別名を指定する必要があります。

いくつかのドライバは、システムに直接追加および構成せずに、システムブートとしてのみ構成してください。この制限の理由には、ブート初期の構成にドライバの依存性があるため、またはドライバの追加と同時にインストールまたは更新されるいくつかのカーネルコンポーネントに依存性があるためなどがあります。そのようなドライバは、システムのリブート時のみにドライバがロードおよび構成されるように、必ず –n フラグを指定してシステムに追加する必要があります。これにより、ドライバを適切に構成できる環境が保証されます。

バグ

旧バージョンの add_drv は、device_driver のパス名を受け入れていました。この機能はもうサポートされていないため、結果的にエラーが発生します。