「インストール - Bluetoothドライバ」の版間の差分

編集の要約なし
 
(同じ利用者による、間の14版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
LinuxでBluetoothデバイスを制御する場合、専用ドライバをインストールする必要がある可能性が高い。<br>
LinuxでBluetoothデバイスを制御する場合、Realtek社等のBluetoothドライバを手動でのインストールが必要な可能性がある。<br>
<br>
<br>
ここでは、Bluetoothデバイスの各チップにおいて、専用ドライバのインストール手順を記載する。<br>
ここでは、Bluetoothデバイスの各チップにおいて、各チップベンダの専用ドライバのインストール手順を記載する。<br>
<br><br>
<br><br>


8行目: 8行目:
==== パッケージ管理システムからインストール ====
==== パッケージ管理システムからインストール ====
BlueZをインストールする。<br>
BlueZをインストールする。<br>
  sudo zypper install bluez
<br>
  sudo zypper install bluez bluez-util
<br>
<br>
BlueZサービスを開始する。<br>
BlueZサービスを開始する。<br>
<br>
  sudo systemctl start bluetooth
  sudo systemctl start bluetooth
<br>
<br>
BlueZサービスを自動起動に設定する。<br>
BlueZサービスを自動起動に設定する。<br>
<br>
  sudo systemctl enable bluetooth
  sudo systemctl enable bluetooth
<br>
<br>
==== ソースコードからインストール ====
==== ソースコードからインストール ====
BlueZのビルドに必要なライブラリをインストールする。<br>
BlueZのビルドに必要なライブラリをインストールする。<br>
<br>
  sudo zypper install dbus-1-devel glib2-devel libudev-devel libical-devel rst2html5
  sudo zypper install dbus-1-devel glib2-devel libudev-devel libical-devel rst2html5
<br>
<br>
[http://www.bluez.org/ BlueZの公式Webサイト]にアクセスして、BlueZのソースコードをダウンロードする。<br>
[http://www.bluez.org/ BlueZの公式Webサイト]にアクセスして、BlueZのソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
ダウンロードしたファイルを解凍する。<br>
<br>
  tar xf bluez-<バージョン>.tar.xz
  tar xf bluez-<バージョン>.tar.xz
  cd bluez-<バージョン>
  cd bluez-<バージョン>
<br>
<br>
BlueZをビルドおよびインストールする。<br>
BlueZをビルドおよびインストールする。<br>
<br>
  mkdir build && cd build
  mkdir build && cd build
   
   
40行目: 45行目:
  vi ~/.profile
  vi ~/.profile
<br>
<br>
<syntaxhighlight lang="sh">
  # ~/.profileファイル
  # ~/.profileファイル
   
   
  export PATH="/<BlueZのインストールディレクトリ>/bin:$PATH"
  export PATH="/<BlueZのインストールディレクトリ>/bin:$PATH"
  export LD_LIBRARY_PATH="/<BlueZのインストールディレクトリ>/lib64:/<BlueZのインストールディレクトリ>/lib:$LD_LIBRARY_PATH"
  export LD_LIBRARY_PATH="/<BlueZのインストールディレクトリ>/lib64:/<BlueZのインストールディレクトリ>/lib:$LD_LIBRARY_PATH"
</syntaxhighlight>
<br><br>
<br><br>


52行目: 59行目:
競合するBluetoothモジュールをブラックリストに入れるため、/etc/modprobe.dディレクトリに.confファイル作成して、以下の内容を記述する。<br>
競合するBluetoothモジュールをブラックリストに入れるため、/etc/modprobe.dディレクトリに.confファイル作成して、以下の内容を記述する。<br>
以下の例では、/etc/modprobe.d/50-bluetooth-blacklist.confファイルを作成している。<br>
以下の例では、/etc/modprobe.d/50-bluetooth-blacklist.confファイルを作成している。<br>
<u>※以下の/etc/modprobe.d/50-bluetooth-blacklist.confファイルの作成において、環境によっては不要の可能性があることに注意する。</u><br>
<br>
<u>※注意</u><br>
<u>/etc/modprobe.d/50-bluetooth-blacklist.confファイルの作成において、環境によっては不要の可能性があることに注意する。</u><br>
<br>
  sudo vi /etc/modprobe.d/50-bluetooth-blacklist.conf
  sudo vi /etc/modprobe.d/50-bluetooth-blacklist.conf
<br>
<br>
63行目: 73行目:
<br>
<br>
BluetoothのUSBドングルをPCに接続して、デバイスが認識されているかどうかを確認する。<br>
BluetoothのUSBドングルをPCに接続して、デバイスが認識されているかどうかを確認する。<br>
<br>
  sudo hwinfo --bluetooth
  sudo hwinfo --bluetooth
<br>
<br>
RTL8761BUドライバのソースコードをダウンロードする。<br>
RTL8761BUドライバのソースコードをダウンロードする。<br>
<br>
  git clone https://github.com/Elif-dot/RTL8761BU.git
  git clone https://github.com/Elif-dot/RTL8761BU.git
  # または
  # または
75行目: 87行目:
<br>
<br>
ダウンロードしたファイルのディレクトリに移して、RTL8761BUドライバをビルドおよびインストールする。<br>
ダウンロードしたファイルのディレクトリに移して、RTL8761BUドライバをビルドおよびインストールする。<br>
<br>
  cd <RTL8761BUドライバのソースディレクトリ>
  cd <RTL8761BUドライバのソースディレクトリ>
  sudo make install INTERFACE=usb
  sudo make install INTERFACE=usb
84行目: 97行目:
<br>
<br>
もし、インストールに失敗する場合は、Linuxカーネルを修復する。<br>
もし、インストールに失敗する場合は、Linuxカーネルを修復する。<br>
<br>
  cd /usr/src/linux
  cd /usr/src/linux
  sudo make -j $(nproc) oldconfig
  sudo make -j $(nproc) oldconfig
  sudo make -j $(nproc) prepare
  sudo make -j $(nproc) prepare
90行目: 105行目:
RTL8761BUドライバのソースディレクトリは、任意のディレクトリに保存する。<br>
RTL8761BUドライバのソースディレクトリは、任意のディレクトリに保存する。<br>
<br>
<br>
以下のコマンドは不要の可能性が高いが、記載しておく。<br>
以下に示すコマンドは不要の可能性が高いが、記載しておく。<br>
<br>
  sudo modprobe rtk_btusb  # 不要の可能性あり
  sudo modprobe rtk_btusb  # 不要の可能性あり
<br>
<br>
100行目: 116行目:
もし、既にRTL8761BUモジュールのバックアップが存在する場合、<br>
もし、既にRTL8761BUモジュールのバックアップが存在する場合、<br>
rtk_btusbモジュール、rtl8761bu_fwファイル、rtl8761bu_configファイルを以下のディレクトリにコピーして、モジュール群をデプロイすることもできる。<br>
rtk_btusbモジュール、rtl8761bu_fwファイル、rtl8761bu_configファイルを以下のディレクトリにコピーして、モジュール群をデプロイすることもできる。<br>
<br>
  # RTL8761BUモジュールのコピー
  # RTL8761BUモジュールのコピー
  sudo cp rtk_btusb.ko /lib/modules/$(uname -r)/kernel/drivers/bluetooth/
  sudo cp rtk_btusb.ko /lib/modules/$(uname -r)/kernel/drivers/bluetooth/
107行目: 124行目:
  sudo depmod -a $(uname -r)
  sudo depmod -a $(uname -r)
<br>
<br>
 
Bluetoothドングルと機器が正常に接続されている場合、ジャーナルを確認すると、以下に示すようなメッセージが出力される。<br>
sudo journalctl --unit=bluetooth -f
# 出力例
# Xの箇所には、任意の数字またはアルファベットが入ることに注意する
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/sbc
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSink/sbc_xq
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/sbc_xq
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/faststream
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/faststream_duplex
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSink/opus_05
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/opus_05
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSink/opus_05_duplex
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: Endpoint registered: sender=:X.XX path=/MediaEndpoint/A2DPSource/opus_05_duplex
<タイムスタンプ> <ホスト名> bluetoothd[<プロセス番号>]: /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX/sepX/fdX: fd(XX) ready
<br>
==== RTL8761BUドライバのアンインストール ====
==== RTL8761BUドライバのアンインストール ====
RTL8761BUドライバをアンインストールする。<br>
RTL8761BUドライバをアンインストールする。<br>
<br>
  cd /<RTL8761BUドライバのソースディレクトリ>/rtkbt-firmware/lib/firmware
  cd /<RTL8761BUドライバのソースディレクトリ>/rtkbt-firmware/lib/firmware
  sudo make uninstall
  sudo make uninstall
<br>
<br>
標準のBluetoothドライバを有効にする。<br>
標準のBluetoothドライバを有効にする。<br>
<br>
  sudo rm /etc/modprobe.d/50-bluetooth-blacklist.conf
  sudo rm /etc/modprobe.d/50-bluetooth-blacklist.conf
<br>
<br>
RTL8761BUドライバのファームウェアファイルおよびその設定ファイルを削除する。<br>
RTL8761BUドライバのファームウェアファイルおよびその設定ファイルを削除する。<br>
<br>
  sudo rm /lib/firmware/rtl8761bu_fw /lib/firmware/rtl8761bu_config
  sudo rm /lib/firmware/rtl8761bu_fw /lib/firmware/rtl8761bu_config
<br><br>
<br><br>


== Realtek BT8761BUモジュールの署名 (セキュアブートが有効の場合) ==
== Realtek RTL8761BUモジュールの署名 (セキュアブートが有効の場合) ==
セキュアブートが有効の場合、Realtek BT8761BUモジュールの署名を登録する必要がある。<br>
セキュアブートが有効の場合、Realtek RTL8761BUモジュールは署名済みの状態で読み込む必要がある。<br>
<u>また、ユーザが勝手にモジュールファイルをXZ形式等へ圧縮してはならない。(モジュールの署名に失敗するため)</u><br>
MOK (Machine Owner Key) の登録は初回のみ必要であり、同じ鍵を使い続ける限り、Linuxカーネルの更新ごとにMOKを再登録する必要はない。<br>
<br>
<br>
署名を登録する手順を以下に示す。<br>
<u>また、モジュールの圧縮は署名後に行う必要があることに注意する。</u><br>
<br>
<br>
==== 初回のみ必要なMOKの登録 ====
まず、署名に必要な設定ファイルを作成する。<br>
まず、署名に必要な設定ファイルを作成する。<br>
mkdir -p ~/.MOK/RTL8761BU && cd ~/.MOK/RTL8761BU
vi RTL8761BU.config
<br>
<br>
  # ~/.MOK/RTL8761BU/RTL8761BU.configファイル
sudo mkdir -p /root/.MOK/RTL8761BU && cd /root/.MOK/RTL8761BU
<br>
sudo vi RTL8761BU.config
<br>
<syntaxhighlight lang="ini">
  # /root/.MOK/RTL8761BU/RTL8761BU.configファイル
   
   
  [ req ]
  [ req ]
140行目: 179行目:
   
   
  [ req_distinguished_name ]
  [ req_distinguished_name ]
  O = SUSE Linux Products GmbH (User Add RTL8761BU)           # 任意の名前
  O = SUSE Linux Products GmbH (User Add RTL8761BU)
  CN = SUSE Linux Enterprise Secure Boot (User Add RTL8761BU) # 任意の名前
  CN = SUSE Linux Enterprise Secure Boot (User Add RTL8761BU)
  emailAddress = suse@localhost                               # 任意のメールアドレス
  emailAddress = suse@localhost
   
   
  [ myexts ]
  [ myexts ]
149行目: 188行目:
  subjectKeyIdentifier=hash
  subjectKeyIdentifier=hash
  authorityKeyIdentifier=keyid
  authorityKeyIdentifier=keyid
</syntaxhighlight>
<br>
<br>
キーペアを作成する。<br>
キーペアを作成する。<br>
  openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./RTL8761BU.config \
  openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./RTL8761BU.config \
-outform DER -out ./RTL8761BU.der -keyout ./RTL8761BU.priv \
            -outform DER -out ./RTL8761BU.der -keyout ./RTL8761BU.priv \
-addext "extendedKeyUsage=codeSigning"
            -addext "extendedKeyUsage=codeSigning"
<br>
MOKに公開鍵をインポートする。<br>
<code>--root-pw</code> オプションを付加した場合、MokManagerでrootパスワードによる確認を行う。<br>
<br>
<br>
次に、MOK(Module owned Key)にキーをインポートする。<br>
<code>--root-pw</code>オプションを付加することにより、再起動時のRealtek BT8761BUモジュールの署名において、rootパスワードが必要となる。<br>
  sudo mokutil --import ./RTL8761BU.der --root-pw
  sudo mokutil --import ./RTL8761BU.der --root-pw
<br>
<br>
PCを再起動して、上記のキーの署名する。<br>
PCを再起動して、MokManagerで登録を完了する。<br>
sudo systemctl reboot
この操作はファームウェア側の確認処理であり、自動化は困難である。<br>
<br>
sudo systemctl reboot
<br>
MOKが正しく登録されているかどうかを確認する。<br>
<br>
cd /root/.MOK/RTL8761BU
sudo mokutil --test-key ./RTL8761BU.der
<br>
正常に登録されている場合は、<u>"RTL8761BU.der is already enrolled"</u>のような内容が表示される。<br>
<br>
==== 手動で署名する場合 ====
DKMSを使用せず、現在利用中のLinuxカーネル向けモジュールを手動で署名する手順を以下に示す。<br>
まず、Realtek RTL8761BUモジュール(rtk_btusb.ko)を署名する。<br>
<br>
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 \
      /root/.MOK/RTL8761BU/RTL8761BU.priv \
      /root/.MOK/RTL8761BU/RTL8761BU.der  \
      /lib/modules/$(uname -r)/kernel/drivers/bluetooth/rtk_btusb.ko
<br>
次に、Realtek RTL8761BUモジュールをZstandard形式に圧縮する。<br>
この工程は、署名後かつ<code>depmod</code>と<code>modprobe</code>の直前に行う。<br>
<br>
sudo zstd --rm /lib/modules/$(uname -r)/kernel/drivers/bluetooth/rtk_btusb.ko
<br>
最後に、モジュール依存リストを更新して、Realtek RTL8761BUモジュールを読み込む。<br>
<br>
<br>
Realtek BT8761BUモジュール(rtk_btusb)を署名して、モジュールを読み込む。<br>
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./RTL8761BU.priv ./RTL8761BU.der /lib/modules/$(uname -r)/kernel/drivers/bluetooth/rtk_btusb.ko
  sudo depmod -a $(uname -r)
  sudo depmod -a $(uname -r)
sudo modprobe -v rtk_btusb
<br>
<br>
Realtek BT8761BUモジュールが正しく読み込まれているかどうかを確認する。<br>
Realtek RTL8761BUモジュールが正常に読み込まれているかどうかを確認する。<br>
正常に読み込まれている場合は、<u>"RTK_8761BU.der is already enrolled"</u>と表示される。<br>
cd <Realtek BT8761BUモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --test-key ./RTK_8761BU.der
<br>
<br>
この署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。<br>
lsmod | grep rtk_btusb
<br>
<br>
作成したキーは信頼されるため、キーを適切に保存する必要がある。<br>
作成したキーは信頼されるため、キーを適切に保存する必要がある。<br>
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。<br>
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。<br>
<br>
==== MOKの削除 ====
登録済みのMOKを削除する場合、以下のコマンドを実行してから再起動する。<br>
<br>
cd /root/.MOK/RTL8761BU
sudo mokutil --delete ./RTL8761BU.der --root-pw
sudo systemctl reboot
<br><br>
== Realtek RTL8761BUモジュールのDKMSによる自動再ビルドおよび自動署名 ==
初回のみMOKを登録しておけば、その後はDKMSでモジュールの再ビルドおよび再署名を自動化できる。<br>
<br>
==== RTL8761BUドライバをDKMSへ登録する ====
RTL8761BUドライバのソースコードをDKMS管理用のディレクトリに配置する。<br>
<br>
以下の例では、バージョンを <code>1.0</code> としている。<br>
<br>
sudo mkdir -p /usr/src/rtl8761bu-1.0
sudo cp -a <RTL8761BUドライバのソースディレクトリ>/* /usr/src/rtl8761bu-1.0/
<br>
<u>/usr/src/rtl8761bu-1.0/dkms.conf</u> ファイルを作成する。<br>
<br>
<u>※注意</u><br>
<u>DKMSは自動的に <code>-j $(nproc)</code> を付加するため記述する必要はない。</u><br>
<br>
sudo vi /usr/src/rtl8761bu-1.0/dkms.conf
<br>
<syntaxhighlight lang="make">
# /usr/src/rtl8761bu-1.0/dkms.confファイル
PACKAGE_NAME="rtl8761bu"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="rtk_btusb"
DEST_MODULE_LOCATION[0]="/kernel/drivers/bluetooth"
AUTOINSTALL="yes"
MAKE[0]="make INTERFACE=usb"
CLEAN="make clean"
</syntaxhighlight>
<br>
DKMSが署名に使用する鍵を設定する。<br>
<br>
sudo vi /etc/dkms/framework.conf
<br>
# /etc/dkms/framework.confファイル
mok_signing_key="/root/.MOK/RTL8761BU/RTL8761BU.priv"
mok_certificate="/root/.MOK/RTL8761BU/RTL8761BU.der"
<br>
上記の設定により、DKMSは新しいLinuxカーネル向けにモジュールを再ビルドする時、同じ鍵を利用できる。<br>
秘密鍵はrootのみが読み込めるように厳格に管理する。<br>
<br>
DKMSへモジュールを登録して、ビルドおよびインストールする。<br>
<br>
sudo dkms add -m rtl8761bu -v 1.0
sudo dkms build -m rtl8761bu -v 1.0
sudo dkms install -m rtl8761bu -v 1.0
<br>
DKMSのバージョンまたはディストリビューションによっては、自動署名が期待通りに行われない場合がある。<br>
その場合は、以下のように手動で署名する。<br>
<br>
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 \
      /root/.MOK/RTL8761BU/RTL8761BU.priv \
      /root/.MOK/RTL8761BU/RTL8761BU.der  \
      /lib/modules/$(uname -r)/updates/dkms/rtk_btusb.ko
<br>
次に、Realtek RTL8761BUモジュールをZstandard形式に圧縮する。<br>
この工程は、署名後かつ <code>depmod</code> と <code>modprobe</code> の直前に行う。<br>
<br>
sudo zstd --rm /lib/modules/$(uname -r)/updates/dkms/rtk_btusb.ko
<br>
最後に、モジュール依存リストを更新して、Realtek RTL8761BUモジュールを読み込む。<br>
<br>
sudo depmod -a $(uname -r)
sudo modprobe -v rtk_btusb
<br>
Realtek RTL8761BUモジュールが正常に読み込まれているかどうかを確認する。<br>
<br>
lsmod | grep rtk_btusb
<br>
==== 共通鍵で複数モジュールを署名する場合 ====
複数のDKMSモジュールを同じMOKで署名する場合、<u>/etc/dkms/framework.conf</u> に共通の鍵を記述する。<br>
この方法では、MOKの登録は1回でよい。<br>
<br>
設定例を以下に示す。<br>
<br>
sudo vi /etc/dkms/framework.conf
<br>
<syntaxhighlight lang="make">
# /etc/dkms/framework.confファイル
mok_signing_key="/root/.MOK/common/MOK.priv"
mok_certificate="/root/.MOK/common/MOK.der"
</syntaxhighlight>
<br>
上記の設定により、DKMSで管理される複数のモジュールは同じ鍵で署名される。<br>
例えば、Bluetoothドライバの <u>rtk_btusb</u> モジュールと、Wi-Fiドライバの <u>8821au</u> モジュールに対して同じ鍵を利用できる。<br>
<br>
この方法は管理が容易であり、通常はこちらを推奨する。<br>
<br>
==== モジュールごとに別鍵を使う場合 ====
モジュールごとに別々の秘密鍵および公開鍵を使用する場合、<u>/etc/dkms/framework.conf</u> だけでは切り分けが難しい。<br>
<br>
そのため、各モジュールの <u>dkms.conf</u> で <code>POST_BUILD</code> を利用して、個別に <code>sign-file</code> コマンドを呼び出す。<br>
<br>
===== 例1: RTL8761BU向けのdkms.conf =====
sudo vi /usr/src/rtl8761bu-1.0/dkms.conf
<br>
<syntaxhighlight lang="make">
# /usr/src/rtl8761bu-1.0/dkms.confファイル
PACKAGE_NAME="rtl8761bu"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="rtk_btusb"
DEST_MODULE_LOCATION[0]="/kernel/drivers/bluetooth"
AUTOINSTALL="yes"
MAKE[0]="make INTERFACE=usb"
CLEAN="make clean"
POST_BUILD="./sign-module.sh"
</syntaxhighlight>
<br>
===== 例2: RTL8761BU向けの署名スクリプト =====
sudo vi /usr/src/rtl8761bu-1.0/sign-module.sh
<br>
<syntaxhighlight lang="sh">
# /usr/src/rtl8761bu-1.0/sign-module.shファイル
#!/usr/bin/emv sh
set -eu
MODULE="/var/lib/dkms/rtl8761bu/1.0/${kernelver}/${arch}/module/rtk_btusb.ko"
/lib/modules/${kernelver}/build/scripts/sign-file sha256 \
/root/.MOK/rtl8761bu/RTL8761BU.priv \
/root/.MOK/rtl8761bu/RTL8761BU.der  \
"${MODULE}"
</syntaxhighlight>
<br>
実行権限を付与する。<br>
<br>
sudo chmod a+x /usr/src/rtl8761bu-1.0/sign-module.sh
<br>
===== 例3: POST_BUILDで署名とZstandard圧縮をまとめて行う場合 =====
<code>POST_BUILD</code> で署名とZstandard形式への圧縮をまとめて行うこともできる。<br>
<br>
この場合、署名スクリプト内で <code>sign-file</code> コマンドを実行した後、<code>zstd</code> コマンドを実行する。<br>
<br>
<u>dkms.conf</u> の例を以下に示す。<br>
<br>
sudo vi /usr/src/rtl8761bu-1.0/dkms.conf
<br>
<syntaxhighlight lang="make">
# /usr/src/rtl8761bu-1.0/dkms.confファイル
PACKAGE_NAME="rtl8761bu"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="rtk_btusb"
DEST_MODULE_LOCATION[0]="/kernel/drivers/bluetooth"
AUTOINSTALL="yes"
CLEAN="make clean"
POST_BUILD="./sign-and-compress-module.sh"
</syntaxhighlight>
<br>
次に、署名および圧縮用のスクリプトを作成する。<br>
<br>
sudo vi /usr/src/rtl8761bu-1.0/sign-and-compress-module.sh
<br>
<syntaxhighlight lang="sh">
# /usr/src/rtl8761bu-1.0/sign-and-compress-module.shファイル
#!/usr/bin/env sh
set -eu
MODULE="/var/lib/dkms/rtl8761bu/1.0/${kernelver}/${arch}/module/rtk_btusb.ko"
/lib/modules/${kernelver}/build/scripts/sign-file sha256 \
/root/.MOK/rtl8761bu/RTL8761BU.priv \
/root/.MOK/rtl8761bu/RTL8761BU.der \
"${MODULE}"
zstd --rm --ultra -22 -T0 "${MODULE}"
</syntaxhighlight>
<br>
実行権限を付与する。<br>
<br>
sudo chmod a+x /usr/src/rtl8761bu-1.0/sign-and-compress-module.sh
<br>
この方法では、DKMSのビルド完了後に署名および圧縮が連続して実行される。<br>
その後、必要に応じて <code>depmod</code> および <code>modprobe</code> を実行する。<br>
<br>
===== 例4: 別モジュール側の考え方 =====
例えば、Wi-Fiドライバ用に別鍵を使用する場合は、同様にそのモジュール専用の <u>sign-module.sh</u> を作成する。<br>
その時、秘密鍵と公開鍵のパスのみを変更する。<br>
<br>
# 例:
/root/.MOK/rtl8821au/RTL8821AU.priv
/root/.MOK/rtl8821au/RTL8821AU.der
<br>
===== 注意事項 =====
* <code>POST_BUILD</code> で参照するモジュールパスは、DKMSのバージョンやディストリビューションによって差異が出る可能性がある。
*: 実際の環境で <u>/var/lib/dkms/</u> ディレクトリ内の生成先を確認することが望ましい。
* <code>POST_BUILD</code> でZstandard形式へ圧縮する場合、後続のインストール工程が圧縮済みモジュールを正しく扱うかどうかを事前に確認する。
*: 環境によっては、<code>POST_INSTALL</code> で最終配置先のモジュールを圧縮する方が安全な場合がある。
* モジュールを圧縮する場合は、署名後に行う必要がある。
*: 例えば、Zstandard形式に圧縮する場合は以下のように実行する。
*: <pre>sudo zstd --rm /lib/modules/$(uname -r)/updates/dkms/rtk_btusb.ko</pre>
* 共通鍵方式の方が管理が簡単であり、通常はそちらを優先する。
* モジュールごとに別鍵を使う方式は、用途ごとに信頼範囲を分離したい場合に有効である。
<br>
==== Linuxカーネルを更新した場合の扱い ====
Linuxカーネルを更新した場合、MOKの再登録は不要である。<br>
同じ秘密鍵および公開鍵を使い続ける限り、必要なのは新しいLinuxカーネル向けに再ビルドされたモジュールへの再署名のみである。<br>
<br>
DKMSを設定済みであれば、通常はLinuxカーネルの更新時に自動で再ビルドおよび再インストールが行われる。<br>
<br>
必要に応じて、署名、Zstandard圧縮、<code>depmod</code>、<code>modprobe</code> を順に実行する。<br>
<br><br>
<br><br>


182行目: 461行目:
<code>lsusb</code>コマンドを実行して、Bluetoothデバイスのベンダ名と製品IDを確認する。<br>
<code>lsusb</code>コマンドを実行して、Bluetoothデバイスのベンダ名と製品IDを確認する。<br>
以下の例では、ベンダ名(idVendor)は0bda、製品ID(idProduct)は1724である。<br>
以下の例では、ベンダ名(idVendor)は0bda、製品ID(idProduct)は1724である。<br>
<br>
  lsusb
  lsusb
   
   
193行目: 473行目:
/etc/udev/rules.dディレクトリに、新しいルールファイル(ファイル名は任意)を作成して、以下の内容を記述する。<br>
/etc/udev/rules.dディレクトリに、新しいルールファイル(ファイル名は任意)を作成して、以下の内容を記述する。<br>
<code>echo enabled</code>および<code>echo disabled</code>を記述することにより、リモートウェイクアップ機能の有効 / 無効を設定する。<br>
<code>echo enabled</code>および<code>echo disabled</code>を記述することにより、リモートウェイクアップ機能の有効 / 無効を設定する。<br>
<br>
  sudo vi /etc/udev/rules.d/90-BluetoothWakeUp.rules
  sudo vi /etc/udev/rules.d/90-BluetoothWakeUp.rules
<br>
<br>
201行目: 482行目:
BluetoothデバイスのUSBドングルをPCに再接続して、リモートウェイクアップ機能が有効になっているかどうかを確認する。<br>
BluetoothデバイスのUSBドングルをPCに再接続して、リモートウェイクアップ機能が有効になっているかどうかを確認する。<br>
<br><br>
<br><br>
== エラー ==
==== 送受信エラー ====
Bluetoothを通してファイルを送受信する場合、以下に示すようなエラーが出力される場合がある。<br>
<br>
Failed to start org.bluez.obex service: Unit dbus-org.bluez.obex.service not found.
<br>
まず、Bluetooth向けObexライブラリをインストールする。<br>
<br>
sudo zypper install bluez-obexd
<br>
次に、Bluetooth向けObexを有効にする。<br>
<br>
sudo systemctl --global enable obex
# 出力
Created symlink /etc/systemd/user/dbus-org.bluez.obex.service → /usr/lib/systemd/user/obex.service.
<br>
最後に、Bluetooth向けObexを開始する。<br>
<br>
systemctl --user start obex
<br>
もし、上記の手順を実行してもデータの送受信が出来ない場合は、ジャーナルを確認する。<br>
<br>
sudo journalctl --unit=bluetooth -f
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]