Intel 및 Broadcom의 일부 최신 Bluetooth 칩셋에서는 btattach
Bluetooth를 올바르게 활성화하기 위해 사용자 공간에서 이 명령을 실행해야 합니다(BT 칩셋을 "연결"하고 필요할 때 필요한 펌웨어 로드를 트리거함).
이에 대한 예는 다음 명령이 필요한 Lenovo ThinkPad 8 태블릿의 Broadcom BCM43241 rev B5 칩셋이지만 # btattach --bredr /dev/ttyS1 -P bcm
이는 UART 컨트롤러에 연결된 다른 많은 Bluetooth 칩셋에 적용됩니다.
btattach
Q: 부팅 중에 Bluetooth를 자동으로 활성화하기 위해 필요한 명령을 실행하는 가장 권장되는 방법은 무엇입니까??
PS 요즘 많은 최신 장치에는 기본적으로 Bluetooth 기능이 전혀 없기 때문에 명령 패키징을 시작한 Linux 배포판(예: Debian) btattach
에 이러한 수정 사항을 제공하는 것이 아이디어입니다. 이는 풀사이즈 USB 포트가 거의 없거나 전혀 없는 태블릿에 특히 유용합니다.
답변1
linux-bluetooth 메일링 리스트에 대한 토론에서는 해당 메일링 리스트를 만들 것을 제안했습니다 udev rule
. 을 참조하세요.이 메시지.
질문에 언급된 특정 칩셋의 경우 간단한 udev 규칙은 다음과 같습니다.
$ cat /etc/udev/rules.d/98-bluetooth-attach-broadcom.rule KERNEL=="BCM2E55:00", RUN+="/usr/bin/btattach --bredr /dev/ttyS1 -P bcm"
그리고BCM2E55:00해당 Bluetooth 칩셋의 하드웨어 ACPI 식별자이며 다음과 같이 표시됩니다.터미널 S1장치 노드( 의 sysfs를 통해 표시됨 /sys/devices/platform/80860F0A:00/tty/ttyS1/device/BCM2E55:00$
) 각 ACPI 식별자를 규칙 파일에 추가하고 해당 /dev/ttyS*를 각 칩셋 변형에 맞게 조정해야 합니다.
그러나 이 간단한 접근 방식의 알려진 한계는 위에서 언급한 것처럼 짧은 시간 동안만 작동한다는 것입니다.여기. 실제로 btattach
명령은 몇 초/분 후에 종료됩니다. 이는 다음 동작에 대한 기록입니다 udev
.
데몬이나 기타 장기 실행 프로세스를 시작하는 것은 분리 여부에 관계없이 udev에 적합하지 않습니다.사망이벤트 처리가 완료된 후. `
btattach
따라서 다른 옵션에서는 종료되지 않도록 하기 위해 예를 들어 systemd 서비스를 통해 규칙 자체에서 직접 명령을 실행하는 대신 간접적인 트리거링이 필요합니다 .udev
btattach
이 간단한 대답은 예비 테스트를 수행할 때, 특히 올바른 udev 규칙 조건을 찾을 때 여전히 유용할 수 있습니다.
답변2
보다 정교한 접근 방식은 udev
올바른 하드웨어가 있을 때만 트리거되는 규칙을 btattach
생성 하는 것입니다 systemd service
. 이는 이전 두 가지 답변을 결합한 개념입니다.
질문에 언급된 특정 칩셋의 경우 udev
규칙은 간단해 보입니다.
$ cat /etc/udev/rules.d/99-bluetooth-btattach.rules KERNEL=="BCM2E55:00", RUN+="/bin/systemctl --no-block start btattach-broadcom-ttyS1.service"
그리고BCM2E55:00해당 Bluetooth 칩셋의 하드웨어 ACPI 식별자입니다.
systemd 서비스, 하위 항목으로 나타나는 칩셋과만 호환됨터미널 S1장치 노드( 의 sysfs를 통해 표시됨 /sys/devices/platform/80860F0A:00/tty/ttyS1/device/BCM2E55:00$
)는 다음과 같이 매우 간단하게 유지될 수 있습니다.
$ cat /etc/systemd/system/btattach-broadcom-ttyS1.service [Unit] Description=Start btattach, needed to enable Bluetooth for some UART-based Bluetooth Broadcom chipsets [Service] Type=simple # A delay is needed, 1s seems enough ExecStartPre=/bin/sleep 1s ExecStart=/usr/bin/btattach --bredr /dev/ttyS1 -P bcm
이는 하위 키(및 매개변수)로 나타나는 다른 Broadcom 칩셋에 대해 systemd service
있는 그대로 작동합니다.-P bcm
ttys1(그래서 /dev/ttyS1
) udev
다른 칩셋 변형에 대한 ACPI 식별자를 포함하도록 규칙을 완성하세요.
다른 ttyS* 노드에 연결된 Broadcom 칩셋의 경우 systemd service
이 경우를 처리하기 위해 또 다른 유사한 칩셋을 생성할 수 있습니다(또는 udev 규칙에서 systemd 서비스로 올바른 매개변수를 공유할 수 있습니다).
태블릿을 다시 시작하면 btattach
시작 시 명령이 올바르게 실행된 것으로 나타났습니다.
$ ps auxw | grep btattach root 2059 0.0 0.0 6372 720 ? Ss 23:17 0:00 /usr/bin/btattach --bredr /dev/ttyS1 -P bcm
그리고 Bluetooth가 실제로 활성화되어 작동하고 있습니다! Gnome Bluetooth 설정에는 연결 및 검색된 장치가 나열되며 $ bluetoothctl
명령줄에서 실행하면 컨트롤러가 올바르게 표시됩니다.
놀랍게도 단순히 실제 명령을 지연시키는 데 사용되는 초기 1초 절전 명령을 제거하면 Bluetooth가 전혀 작동하지 않고 올바르게 활성화되지 않습니다. 그럼에도 불구하고 btattach
백그라운드 프로세스 목록에서는 여전히 올바르게 실행되는 것으로 나타납니다.
정확히 무슨 일이 일어나고 있는지는 아직 확실하지 않습니다. btattach가 시작되기 전에 타이밍 문제가 있으며 필요한 종속성을 기다려야 하는 것은 확실합니다...
답변3
한 가지 가능한 접근 방식은 다음과 같이 하드코딩된 systemd 서비스를 만드는 것입니다.
$ cat /etc/systemd/system/btattach.service
[Unit]
Description=Start btattach, needed to enable Bluetooth for some UART-based Bluetooth chipsets
[Service]
Type=simple
\# A delay is needed though, 1s seems enough on my system
ExecStartPre=/bin/sleep 1s
ExecStart=/usr/bin/btattach --bredr /dev/ttyS1 -P bcm
[Install]
WantedBy=multi-user.target`
이 새로운 서비스를 활성화하려면 다음 명령을 실행하십시오.
# systemctl --system enable btattach
태블릿을 다시 시작하면 이제 시작 시 btattach 명령이 올바르게 실행되는 것을 볼 수 있습니다.
$ ps auxw | grep btattach
root 2059 0.0 0.0 6372 720 ? Ss 23:17 0:00 /usr/bin/btattach --bredr /dev/ttyS1 -P bcm
그리고 Bluetooth가 실제로 활성화되어 작동하고 있습니다! Gnome Bluetooth 설정에는 연결 및 검색된 장치가 나열되며 $ bluetoothctl
명령줄에서 실행하면 컨트롤러가 올바르게 표시됩니다.
놀랍게도 실제 명령을 단순히 지연시키는 초기 1s sleep
명령을 제거하면 Bluetooth가 전혀 작동하지 않고 제대로 활성화되지 않지만 btattach
백그라운드 프로세스 목록에서는 여전히 올바르게 실행되는 것처럼 보입니다.
정확히 무슨 일이 일어나고 있는지 아직 확실하지 않습니다. 시작하기 전에 타이밍 문제가 있고 필요한 종속성을 기다려야 하는 것은 확실합니다 btattach
.