USBプリンターをLXDコンテナーに転送する

HP LaserJet 1000プリンターをLXDを使用して作成されたコンテナーに送信するために見つけたソリューションを共有したいと思います。

少しの背景


古いAcer Aspire 5520Gラップトップをベースにしたホームサーバーがあり、あらゆる種類の実験に使用されます。 Ubuntu 14.04がインストールされ、LXCを使用していくつかのコンテナが作成されました。そのうちの1つはプリントサーバーとして使用されました。

次の行をゲスト構成ファイルに追加して、プリンターを転送しました。

lxc.cgroup.devices.allow = c 189:* rwm lxc.mount.entry = /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir lxc.mount.entry = /dev/usb/lp0 dev/usb/lp0 none bind,optional,create=file 

すべてうまくいきましたが、Ubuntu 16.04にアップグレードしてLXDを試してみました。

古い構成ファイルは機能せず、新しいソリューションを探す必要があることが判明しました。 ここでも共有したいと思います。

前進する


したがって、Ubuntu 16.04 + LXDがインストールされ、同じUbuntu 16.04に基づくコンテナーが作成され、転送に進みます。
まず、ホスト上のプリンターの接続先を確認します。

 root@aspire-5520g:~# lsusb Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 004: ID 0bda:8197 Realtek Semiconductor Corp. RTL8187B Wireless Adapter Bus 001 Device 003: ID 5986:0102 Acer, Inc Crystal Eye Webcam Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 002: ID 03f0:0517 Hewlett-Packard LaserJet 1000 Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 

プリンターはBus 003 Device 002に接続されています。つまり、unix-charファイル/ dev / bus / usb / 003/002に対応しています。
誰がそれを所有し、どのような権利を持っているかを調べます。

 root@aspire-5520g:~# ls -l /dev/bus/usb/003/002 crw-rw-r-- 1 root lp 189, 257  15 16:02 /dev/bus/usb/003/002 

このファイルは、rootユーザーおよびlpグループ、ファイル0664に対する権限に属します。この情報は、今後役立つものになります。
lpグループの数値識別子が何であるかを調べます。

 root@aspire-5520g:~# cat /etc/group | egrep lp lp:x:7: 

lpグループの数値識別子は7です。
次に、lp0ファイルの所有者と権限を確認します。

 root@aspire-5520g:~# ls -l /dev/usb/lp0 crw-rw---- 1 root lp 180, 0  15 16:02 /dev/usb/lp0 

このファイルは、rootユーザーと0660アクセス許可を持つlpグループに属します。

残念ながら、スポイラーの下でUSBバスを削除することはできませんでした。
検索が続行されます...
私は話を残します:
UPD 03/03/2017
UPD 03/03/2017転送する前に、udevを使用してバインディングデバイスの形でトリックを適用します。
私の場合、プリンターは単独で接続されているため、便利な方法でプリンターをバインドします。 システムでこれを実行する場合は、すべてが少し異なる可能性があることに注意してください。しかし、彼らが言うように、主なことはポイントをキャッチすることです。

接続バスに関係なく、ホストマシン( コンテナ内ではありません! )で転送を実行するには/etc/udev/rules.d/10-printer.rules次の内容のファイル/etc/udev/rules.d/10-printer.rulesます。

10-printer.rules
 SUBSYSTEM=="usb", ATTR{manufacturer}=="Hewlett-Packard", ATTR{product}=="hp LaserJet 1000", SYMLINK+="lj1000" KERNEL=="lp[0-9]", SUBSYSTEM=="usbmisc", SYMLINK+="%k" 


udevはどの形式でも行の折り返しをサポートしないことに注意してください。 udevは単一のルールを複数のルールとして解釈し、期待どおりに動作しないため、ルールで改行を許可しないでください。
(udevルールの記述に関する詳細情報については、 こちらまたはオリジナルをこちらにご連絡ください

この規則により、2つのシンボリックリンクlj1000lp0を作成できます。これらは、ホストシステムの接続バスに関係なく、コンテナへのプリンタの正しい転送と通常の動作に必要です。


プリンターをコンテナに転送します


実際、すべてが強くて複雑ではないことが判明しました。 私の場合、コンテナはprintと呼ばれ、デバイスlj1000を呼び出すことにしました。 転送するには、いくつかの簡単な操作を実行する必要があります。

 root@aspire-5520g:~# lxc config device add print lj1000 unix-char path=/dev/bus/usb/003/002 mode=0664 gid=7  lj1000   print root@aspire-5520g:~# lxc config device add print lp0 unix-char path=/dev/usb/lp0 gid=7  lp0   print 

UPD 03/03/2017
 root@aspire-5520g:~# lxc config device add print lj1000 unix-char path=/dev/lj1000 mode=0664 gid=7  lj1000   print root@aspire-5520g:~# lxc config device add print lp0 unix-char path=/dev/lp0 gid=7  lp0   print 


最初のコマンドは、権限0664でグループ7(lp)に属するunix-charデバイスを転送し、2番目のコマンドは、デフォルトの権限(0660)で同じグループ7に属するデバイスlp0の転送を実行します。

以上です。 デバイスが転送されます。 次に、コンテナにプリンタをインストールする必要があります。

 root@aspire-5520g:~# lxc exec print -- apt update && apt upgrade -y && apt install hplip -y root@aspire-5520g:~# lxc exec print -- hp-setup -i 

ここでは、インストーラーの指示に従うだけです。 結果は、印刷されたテスト印刷ページになります。

以上が、LXDを使用して作成されたコンテナー内でプリンターを転送する方法です。 他のデバイスも同様の方法で転送されると思います。

ご清聴ありがとうございました。

UPD:2017年3月9日残念ながら、すべてがそれほど単純ではないことが判明し、記載されているudevルールではUSBバスを取り除くことができません。 検索が続行されます...
UPD:2017年3 7日コメントでは、誤ってまたは意図的に別のコネクタに再接続された場合や電源によって再接続された場合にプリンタを紛失しないように、デバイスをUSBバスに接続するという質問が発生しました。 正直に言うと、私にとってこの質問は非常に関連性が高いので、このトラブルを回避するのに役立つ追加の指示を記事に追加することと、記事自体のコマンドを修正してすべてを書き直さないようにすることにしました。

Source: https://habr.com/ru/post/J306074/


All Articles