[LINUX] Verbindung zu einer seriellen Konsole über Bluetooth (CentOS 7)

In diesem Artikel erfahren Sie, wie Sie CentOS 7-Computern die Anmeldung einer seriellen Konsole über Bluetooth von einem anderen Gerät aus ermöglichen.

Ich denke, dass die Methode für andere Distributionen etwas anders ist, aber ich denke, dass sie auf die gleiche Weise erreicht werden kann.

Vorwort

Wenn Sie einen Linux-Computer betreiben (insbesondere für Server), stellen Sie häufig über SSH oder ähnliches eine Verbindung von einem anderen Terminal über das Netzwerk her. Konnten Sie jedoch jemals keine SSH-Verbindung herstellen, indem Sie während einer SSH-Verbindung Folgendes tun?

-- /etc/init.d/network stop ( systemctl stop network)

Es ist praktisch, die serielle Konsole dafür zu aktivieren (?). Sie können sich über die serielle Konsole anmelden, indem Sie die seriellen Schnittstellen des Linux-Computers und des Terminal-Computers verbinden. Die meisten modernen PCs verfügen jedoch nicht mehr über eine serielle Schnittstelle. [^ 1]

[^ 1]: Es ist ein 9-poliger D-Sub RS-232C. Vor langer Zeit? Es ist seit ungefähr verschwunden. Es gibt auch ein USB-serielles Konvertierungskabel, das jedoch jeweils etwa 2.000 Yen kostet. Um Maschinen ohne serielle Schnittstelle anzuschließen, schließen Sie jeweils ein Konvertierungskabel an und verbinden Sie sie mit einem seriellen Kabel. Es kostet Geld und ich bin nicht der einzige, der es für ein bisschen Unsinn hält.

Hier kommt Bluetooth ins Spiel. Obwohl die serielle Schnittstelle von modernen PCs verschwunden ist, ist Bluetooth in vielen PCs enthalten (USB-Dongle ist zu einem relativ niedrigen Preis erhältlich, auch wenn er nicht enthalten ist). Eine serielle Kommunikation ist auch über Bluetooth möglich. Ich habe versucht, damit eine serielle Konsolenverbindung herzustellen, daher werde ich die Prozedur veröffentlichen.

Umgebung

Da das Betriebssystem CentOS 7 ist und die GUI-Desktop-Umgebung zum Zeitpunkt der Installation ausgewählt ist, denke ich, dass einige Pakete nicht in einer minimalen Installation installiert werden. Führen Sie bei Bedarf eine yum install durch.

Darüber hinaus werden SELinux-Richtlinien erstellt und integriert, damit SELinux in einem gültigen Status verwendet werden kann. Wenn Sie SELinux deaktiviert haben (Zulässig), können Sie die Schritte unter Erstellen und Anwenden von SELinux-Richtlinien überspringen. [^ 2]

[^ 2]: Selbst im Fall von Permissive werden beim Überspringen des SELinux-Verfahrens viele Überwachungsprotokolle ausgespuckt, sodass ich denke, dass es endlich keinen Verlust gibt. Ich denke, es hängt von der Situation ab, aber ich denke, die Ära der unvermeidlichen Deaktivierung von SELinux ist fast vorbei.

Wie auch immer, das Verfahren

Nehmen Sie zuerst die Einstellungen auf der Linux-Computerseite vor und führen Sie dann das Pairing mit dem Terminal-Computer durch. Sie können nur über das gekoppelte Terminal eine Verbindung zur seriellen Konsole herstellen.

Die Details der Bluetooth-bezogenen Begriffe und Befehle werden nicht erläutert. Oder besser gesagt, ich habe es selbst gemacht, also verstehe ich es nicht genug, um es zu erklären ...

Linux-Maschineneinstellungen

Richten Sie zunächst den Linux-Computer ein, an den die serielle Konsole angeschlossen ist.

Vorbereitung: Überprüfen Sie, ob Bluetooth verfügbar ist

Wenn Bluetooth nicht verfügbar ist, wird die Story nicht gestartet. Überprüfen Sie daher zunächst, ob sie verfügbar ist.

Sie können dies überprüfen, indem Sie auf dmesg grep wie folgt ausführen.

$ grep -i bluetooth /var/log/dmesg
[    9.890172] Bluetooth: Core ver 2.22
[    9.890205] Bluetooth: HCI device and connection manager initialized
[    9.890211] Bluetooth: HCI socket layer initialized
[    9.890215] Bluetooth: L2CAP socket layer initialized
[    9.890223] Bluetooth: SCO socket layer initialized
[    9.930770] Bluetooth: hci0: read Intel version: 370810011003110e00
[    9.936104] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
[   10.271789] Bluetooth: hci0: Intel Bluetooth firmware patch completed and activated

Bearbeiten Sie die Bluetoothd-Konfigurationsdatei

Bearbeiten Sie /etc/bluetooth/main.conf, um AutoEnable zu aktivieren. Standardmäßig ist Bluetooth beim Booten auf Linux-Computern deaktiviert, jetzt jedoch beim Booten. [^ 3]

[^ 3]: Wenn Sie nach dem Start jederzeit aktivieren / deaktivieren möchten, können Sie dies mit "Einschalten" / "Ausschalten" mit "Bluetoothctl" tun.

Der relevante Teil befindet sich am Ende der Datei.

/etc/bluetooth/main.conf


-AutoEnable=false
+#AutoEnable=false
+AutoEnable=true

Systemeinstellungen

Ändern Sie bei systembezogenen Elementen den Betrieb von bluetooth.service beim Start und nehmen Sie die Einstellungen so vor, dass beim seriellen Herstellen einer Verbindung eine Anmeldeaufforderung angezeigt wird.

Fügen Sie SPP beim Start von bluetooth.service hinzu

Erstellen Sie ein Verzeichnis bluetooth.service.d unter / etc / system / systemd / und erstellen Sie eine Drop-In-Konfigurationsdatei darin. Ich denke, dass der Dateiname fast alles sein kann, solange er mit ".conf" endet.

ini:/etc/system/systemd/bluetooth.service.d/add-spp.conf


[Service]
ExecStart=
ExecStart=/usr/libexec/bluetooth/bluetoothd --compat
ExecStartPost=/usr/bin/sdptool add SP

Diese Konfigurationsdatei fügt ein SPP (Serial Port Profile) für die serielle Kommunikation über Bluetooth hinzu, wenn Bluetoothd gestartet wird. Sie müssen bluetoothd mit der Option --compat (oder -C) starten, bevor Sie sdptool verwenden können.

rfcomm-getty unit file

Erstellen Sie eine neue Datei unter / etc / system / systemd /.

/etc/system/systemd/[email protected]


[Unit]
Description=RFCOMM Getty on %I
Documentation=https://qiita.com/tetsuy/items/d9220ac66bd18fd0a01b
After=bluetooth.service
Requires=bluetooth.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/bin/rfcomm watch %I 1 /sbin/agetty 115200,38400,9600 %I
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=getty.target

rfcomm watch wartet auf eine serielle Verbindung und erstellt bei Verbindung ein RFCOMM-Gerät (/ dev / rfcommX) und führt den angegebenen Befehl aus (startet einen untergeordneten Prozess). Wenn Sie angeben, dass hier "agetty" ausgeführt werden soll, und / dev / rfcommX übergeben, wird die Anmeldeaufforderung an der seriellen Quelle angezeigt.

Reflexion der Systemeinstellungen

Obwohl es ein wenig vom Thema abweicht, gibt es einen Artikel, der erklärt, dass das Bearbeiten der Einheitendatei von systemd das Bearbeiten der Datei unter / usr / lib / systemd / system / bedeutet, aber die Methode ist ** falsch. ** ist. (Dateien in diesem Verzeichnis können während des Systemd-Updates aktualisiert werden.)

Referenz: [Red Hat Enterprise Linux 7-Systemadministratorhandbuch / 10.6.4. Ändern vorhandener Gerätedateien](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ sect-Managing_Services_with_systemd-Unit_Files # sect-Managing_Services_with_systemd-Unit_File_Modify)

Zurück zur Geschichte: Sobald die beiden oben genannten Dateien erstellt wurden, werden sie in systemd wiedergegeben und aktiviert.

# systemd daemon-reload
# systemd enable [email protected]

Erstellen von udev-Regeln

Erstellen Sie als Nächstes eine neue Regeldatei unter /etc/udev/rules.d/.

config:/etc/udeb/rules.d/90-rfcomm.rules


KERNEL=="rfcomm[0-9]*", ENV{ID_MM_DEVICE_IGNORE}="1"

Wenn Sie dies nicht tun, reagiert ModemManager auf die RFCOMM-Gerätedatei / dev / rfcomm0, die erstellt wurde, wenn Sie eine Bluetooth-Verbindung vom Terminal herstellen und Daten, die wie ein AT-Befehl aussehen, an das Terminal senden (dies ist für die Anmeldeaufforderung seltsam). Zeichen unterbrechen).

Sie können systemd {stop, disable} ModemManager verwenden, aber da es sich um einen Dienst handelt, der standardmäßig aktiviert ist, habe ich eine Ausschlussregel hinzugefügt, damit ich zu keinem Zeitpunkt süchtig werde.

Erstellung und Durchsetzung von SELinux-Richtlinien

Aufgrund verschiedener Forschungen zu SELinux konnte ich diesmal einen Schritt von "Ich hasse es, SELinux nicht zu essen" machen. Für diejenigen, die nicht gerne wie ich essen, würde ich gerne in den Bergen ausführlicher schreiben, aber ich werde es weglassen, weil die Lautstärke zu stark zunimmt.

Richtlinie der zu erstellenden Richtlinie

In einer SELinux-fähigen Umgebung funktionierte das manuelle Starten von rfcomm über die Shell einwandfrei, aber als ich versuchte, es als Daemon von systemd aus zu starten, funktionierte es nicht. Nachdem wir die Ursache untersucht hatten, fanden wir Folgendes.

Wenn es keine entsprechende SELinux-Richtlinie gibt, habe ich beschlossen, sie selbst zu erstellen, und sie daher mit dem Befehl "ausearch" im zulässigen Modus stetig zerstört. Der Inhalt der erstellten Richtlinie umfasst ungefähr die folgenden vier Punkte.

  1. Erlaube rfcomm, untergeordnete Prozesse zu erzeugen
  2. Wenn rfcomm agetty als untergeordneten Prozess startet, wird seine Domain auf "getty_t" umgestellt.
  3. Ermöglichen Sie den Austausch von Signalen zwischen "rfcomm" - und "agetty" -bezogenen Prozessen
  4. Ermöglichen Sie den Zugriff auf Bluetooth-bezogene Ressourcen (wie / dev / rfcomm0) über "agetty" -bezogene Prozesse

Von diesen ist der wichtigste Punkt 2.

Der Zugriff auf login-bezogene Ressourcen über den "Agetty" -Prozess ist natürlich standardmäßig zulässig. In diesem Fall wird die Operation jedoch abgelehnt. Dies liegt daran, dass der Prozess "agetty" in diesem Fall in der Domäne "bluetooth_t" ausgeführt wird, obwohl die Berechtigungsrichtlinie unter der Annahme festgelegt ist, dass der Prozess "agetty" in der Domäne "getty_t" ausgeführt wird. (Da der untergeordnete Prozess die Domäne des übergeordneten Prozesses übernimmt, geschieht dies, wenn "rfcomm" in der Domäne "bluetooth_t" "agetty" startet.)

ドメインを継承すると agetty がログイン関連のリソースを参照できない

Wenn Sie eine SELinux-Richtlinie erstellen, versetzen Sie sie normalerweise in den zulässigen Modus und verwenden Sie den Befehl "ausearch", um eine Regel zu schreiben, mit der SELinux abgelehnte Aktionen einzeln im Überwachungsprotokoll ausführen kann. Wenn Sie dies in diesem Fall töricht tun, können Prozesse in der Domäne "bluetooth_t" auf login-bezogene Ressourcen zugreifen. Sie werden wahrscheinlich viele Regeln schreiben, und es scheint nicht gut für die Sicherheit zu sein.

Ich schreibe also eine Domain-Übergangsregel, damit der Prozess in der ursprünglichen "getty_t" -Domain gestartet wird, wenn rfcomm agetty startet.

ドメイン遷移によって agetty がログイン関連のリソースを参照できる

Dadurch kann "agetty" gemäß der Standardautorisierungsrichtlinie arbeiten.

So erstellen und wenden Sie eine Richtlinie an

Nun, die Erklärung ist lang, aber es geht darum, wie eine Richtlinie erstellt und angewendet wird.

Installieren Sie das Paket selinux-policy-devel, das zum Generieren der SELinux-Richtliniendatei erforderlich ist.

# yum install selinux-policy-devel

Erstellen Sie außerdem eine te-Datei (Type Enforcement), die die Grundlage für die Richtliniendatei bildet. Die Position ist überall in Ordnung, aber vorläufig ist es / root / selinux /. Wenn Sie make ausführen, werden mehrere Dateien generiert, einschließlich des Verzeichnisses. Daher ist es besser, ein neues dediziertes Verzeichnis zu erstellen.

/root/selinux/rfcomm-getty.te



module rfcomm-getty 1.0;

require {
        type bluetooth_t;
        type getty_exec_t;
        type getty_t;
        type local_login_t;
        class file { execute open read };
        class process { transition sigchld signal };
        class socket { read write };
}

allow bluetooth_t getty_exec_t:file { execute open read };
allow bluetooth_t getty_t:process { transition sigchld };
allow bluetooth_t local_login_t:process signal;
type_transition bluetooth_t getty_exec_t:process getty_t;
allow getty_t bluetooth_t:socket { read write };
allow getty_t bluetooth_t:process sigchld;
allow local_login_t bluetooth_t:process sigchld;
allow local_login_t bluetooth_t:socket { read write };

Generieren Sie aus dieser von Ihnen erstellten Datei eine pp-Datei (Policy Package) und wenden Sie die Richtlinie an.

# cd /root/selinux
# make -f /usr/share/selinux/devel/Makefile rfcomm-getty.pp
/usr/share/selinux/devel/include/contrib/container.if:14: Error: duplicate definition of container_runtime_domtrans(). Original definition on 14.
...snip...
/usr/share/selinux/devel/include/contrib/container.if:498: Error: duplicate definition of container_runtime_typebounds(). Original definition on 684.
Compiling targeted rfcomm-getty module
/usr/bin/checkmodule:  loading policy configuration from tmp/rfcomm-getty.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 19) to tmp/rfcomm-getty.mod
Creating targeted rfcomm-getty.pp policy package
rm tmp/rfcomm-getty.mod.fc tmp/rfcomm-getty.mod
# ls
rfcomm-getty.fc
rfcomm-getty.if
rfcomm-getty.pp
rfcomm-getty.te
tmp

Ich erhalte eine Fehlermeldung, aber es ist in Ordnung, wenn rfcomm-getty.pp generiert wird.

Installieren Sie die von semodule -i generierte Richtlinie.

# semodule -i rfcomm-getty.pp

Neustart der Maschine

Starten Sie zu diesem Zeitpunkt den Computer neu und die serielle Konsole sollte sich über Bluetooth im Standby-Modus befinden.

Serielle Bluetooth-Konsolenverbindung von Windows

Von hier aus müssen Sie den Terminalcomputer koppeln, der mit dem Linux-Computer verbunden werden soll, und sich bei der seriellen Konsole anmelden.

Um eine serielle Konsolenverbindung über Bluetooth herzustellen, müssen der Linux-Computer und der Terminal-Computer im Voraus gekoppelt werden. Umgekehrt bedeutet dies, dass Sie von einem nicht zuvor gekoppelten Terminal aus keine Verbindung zu einer seriellen Konsole über Bluetooth herstellen können.

Paarung

Damit Geräte über Bluetooth miteinander kommunizieren können, müssen sie zuerst gekoppelt werden. Nachdem ein Gerät von umgebenden Geräten erkannt werden kann, sendet das andere Gerät eine Kopplungsanforderung an dieses Gerät.

Hier ist ein Beispiel für das Pairing von einem Windows 10-Computer. [^ 4]

[^ 4]: Im Gegenteil, ich denke, dass es auf die gleiche Weise verwendet werden kann, selbst wenn Sie von der Seite des Linux-Computers aus koppeln (nicht verifiziert), aber ich denke, dass dies in Bezug auf das Verfahren einfacher ist.

Entdecken Sie Linux-Maschinen

Machen Sie zuerst den Linux-Computer von bluetoothctl erkennbar.

# bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX HOSTNAME [default]
[bluetooth]# show
Controller XX:XX:XX:XX:XX:XX
        Name: HOSTNAME
        Alias: HOSTNAME
        Class: 0x000104
        Powered: yes
        Discoverable: no
        Pairable: yes
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d052C
        Discovering: no

Geben Sie an der Bluetoothctl-Eingabeaufforderung show ein, um die Controller-Informationen anzuzeigen. Wenn Sie bestätigen, dass "Powered: yes" und "Pairable: yes" eingestellt und "erkennbar ein" sind, kann der Linux-Computer standardmäßig 3 Minuten lang über Bluetooth erkannt werden.

[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller XX:XX:XX:XX:XX:XX Discoverable: yes
[bluetooth]#

Wenn "Pairable: no" eingestellt ist, schlägt die Kopplung fehl, auch wenn sie gefunden werden kann. Das Pairing ist mit pairable on möglich.

Das Pairing wird von der Seite des Terminalcomputers aus durchgeführt, solange es erkennbar ist.

Pairing mit einem Windows-Computer und COM-Port-Zuweisung

Beschreibt das Pairing von einem Windows-Computer. Natürlich ist das Verfahren anders, aber Sie können eine Verbindung von einem anderen Betriebssystem aus herstellen.

  1. Stellen Sie unter Windows "Einstellungen" -> "Geräte" -> "Bluetooth und andere Geräte" sicher, dass Bluetooth aktiviert ist, und klicken Sie dann auf "Bluetooth oder anderes Gerät hinzufügen".
  2. Wenn das Fenster "Gerät hinzufügen" geöffnet wird, wählen Sie "Bluetooth" und klicken Sie auf den Hostnamen des in der Liste angezeigten Linux-Computers.

Ich denke, dass dies alles ist, was Sie tun müssen, um das Pairing abzuschließen (die Eingabeaufforderung bluetoothctl auf der Linux-Seite zeigt auch an, dass das Pairing abgeschlossen wurde).

Überprüfen Sie außerdem die Zuordnung der seriellen Schnittstelle. Wenn Sie mit aktiviertem SPP koppeln, werden Ihnen automatisch zwei COM-Ports zugewiesen (eingehend und ausgehend).

  1. Scrollen Sie in den Einstellungen "Bluetooth und andere Geräte" nach unten und klicken Sie unter "Verwandte Einstellungen" auf "Andere Bluetooth-Optionen".
  2. Das Fenster "Bluetooth-Einstellungen" wird geöffnet. Klicken Sie auf die Registerkarte "COM-Anschluss".

bluetooth_settings_comports.png

Sie können eine Verbindung zur seriellen Konsole herstellen, indem Sie den hier "Ausgehend" zugewiesenen Port öffnen (in diesem Beispiel COM4).

Serielle Konsolenverbindung

Der schnellste Weg, einen COM-Port zu öffnen, ist die Verwendung des Tera-Begriffs, den Sie wahrscheinlich ständig verwenden. teraterm_serialport.png

Geben Sie bei der Verbindung mit SSH den Hostnamen und den Port an, wählen Sie jedoch "Seriell", wählen Sie den COM-Port aus und klicken Sie auf "OK". nur das. Auf dem Bildschirm sollte eine Anmeldeaufforderung angezeigt werden.

Ungelöste Punkte

Bei einer Verbindung über Bluetooth vom Terminal aus wird das folgende Fehlerprotokoll ausgegeben.

/dev/rfcomm0: cannot get controlling tty:Es ist eine Operation, die nicht erlaubt ist
/dev/rfcomm0: cannot get controlling tty:Es ist eine Operation, die nicht erlaubt ist
/dev/rfcomm0: cannot set process group:Unangemessenes ioctl für Gerät

Ich verstehe die Dinge um TTY immer noch nicht ...

Wenn Sie die Ursache kennen, lassen Sie es mich bitte wissen!

Referenz

Dies sind die Websites und Artikel, auf die ich verwiesen habe. Vielen Dank.

Bonus: Verbinden Sie sich über die Android Terminal App

Ich verwende eine Terminal-App namens ConnectBot unter Android, aber diese App unterstützt keine serielle Verbindung wie Tera Term.

Wenn Sie im Play Store nach "Bluetooth serial" suchen, finden Sie viele Bluetooth-Terminal-Apps, aber keine davon ist so einfach zu bedienen wie die, die Sie ständig verwenden.

Deshalb! Eine App mit dem Namen "Bluetooth Bridge (+ TCP)" wird angezeigt.

Dies ist eine App, die die Kommunikation zwischen zwei Bluetooth oder TCP verbindet. Eine ist eine serielle Bluetooth-Verbindung, die andere ist ein TCP-Server, der jeden Port überwacht, um die bidirektionale Kommunikation zu überbrücken. Von der üblichen Terminal-App aus ist Telnet zum angegebenen Port von localhost in Ordnung!

Ich bin kein Fan dieser App, aber es war ein guter Job, also habe ich sie vorgestellt.

Recommended Posts

Verbindung zu einer seriellen Konsole über Bluetooth (CentOS 7)
Verwenden einer seriellen Konsole unter Ubuntu 20.04
Stellen Sie von CentOS 7 minimal eine Verbindung zu Packetix VPN her.
Stellen Sie eine Verbindung zu MySQL her