Cet article vous montrera comment autoriser les machines CentOS 7 à avoir une connexion à la console série via Bluetooth à partir d'un autre appareil.
Je pense que la méthode est un peu différente pour les autres distributions, mais je pense que cela peut être réalisé de la même manière.
Lorsque vous utilisez une machine Linux (en particulier pour les serveurs), vous vous connectez souvent à partir d'un autre terminal sur le réseau en utilisant SSH ou autre. Cependant, avez-vous déjà été incapable d'établir une connexion SSH en faisant quelque chose comme ce qui suit pendant une connexion SSH?
-- /etc/init.d/network stop
(`` systemctl stop network '')
Il est pratique d'activer la console série pour cela (?). Vous pouvez vous connecter via la console série en connectant les ports série de la machine Linux et du terminal. Cependant, la plupart des PC modernes n'ont plus de port série. [^ 1]
[^ 1]: C'est un D-Sub 9 broches RS-232C. Il y a longtemps? Il a disparu depuis environ. Il existe également un câble de conversion USB-série, mais il coûte environ 2000 yens chacun. Pour connecter des machines qui n'ont pas de port série, connectez un câble de conversion à chacune d'elles et connectez-les avec un câble série. Cela coûte de l'argent et je ne suis pas le seul à penser que c'est un peu absurde.
C'est là que Bluetooth entre en jeu. Bien que le port série ait disparu des PC modernes, le Bluetooth est inclus dans de nombreux PC (le dongle USB est disponible à un prix relativement bas même s'il n'est pas inclus). Et la communication série est également possible avec Bluetooth. J'ai essayé de l'utiliser pour établir une connexion à la console série, je publierai donc la procédure.
Étant donné que le système d'exploitation est CentOS 7 et que l'environnement de bureau GUI est sélectionné au moment de l'installation, je pense que certains packages ne sont pas installés dans une installation minimale. Faites `` yum install '' si nécessaire.
De plus, les politiques SELinux sont créées et incorporées afin que SELinux puisse être utilisé dans un état valide. Si vous avez désactivé SELinux (Permissive), vous pouvez ignorer les étapes de Création et d'application de politiques SELinux. [^ 2]
[^ 2]: Même dans le cas de Permissive, si vous sautez la procédure SELinux, beaucoup de journaux d'audit seront crachés, donc je pense qu'il n'y a pas de perte enfin. Je pense que cela dépend de la situation, mais je pense que l'ère de la désactivation inévitable de SELinux est presque terminée.
Commencez par effectuer les réglages côté machine Linux, puis effectuez le couplage avec la machine côté terminal. Vous ne pouvez vous connecter à la console série qu'à partir du terminal couplé.
Il n'explique pas les détails des termes et commandes liés à Bluetooth. Ou plutôt, je l'ai fait moi-même, donc je ne le comprends pas assez pour l'expliquer ...
Tout d'abord, configurez la machine Linux à laquelle la console série est connectée.
Quoi qu'il en soit, si Bluetooth n'est pas disponible, l'histoire ne commencera pas, alors vérifiez d'abord s'il est disponible.
Vous pouvez le vérifier en faisant `` grep '' sur dmesg comme suit.
$ 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
Modifiez /etc/bluetooth/main.conf pour activer AutoEnable. Par défaut, Bluetooth est désactivé au démarrage sur les machines Linux, mais il est désormais activé au démarrage. [^ 3]
[^ 3]: Si vous souhaitez activer / désactiver à tout moment après le démarrage, vous pouvez le faire avec power on '' /
power off '' avec bluetoothctl
.
La partie pertinente se trouve au bas du fichier.
/etc/bluetooth/main.conf
-AutoEnable=false
+#AutoEnable=false
+AutoEnable=true
Pour les éléments liés à systemd, modifiez le fonctionnement de bluetooth.service au démarrage et définissez les paramètres pour afficher une invite de connexion lors de la connexion en série.
Créez un répertoire bluetooth.service.d sous / etc / system / systemd / et créez-y un fichier de configuration Drop-in. Je pense que le nom du fichier peut être presque n'importe quoi tant qu'il se termine par ".conf".
ini:/etc/system/systemd/bluetooth.service.d/add-spp.conf
[Service]
ExecStart=
ExecStart=/usr/libexec/bluetooth/bluetoothd --compat
ExecStartPost=/usr/bin/sdptool add SP
Ce fichier de configuration ajoute un SPP (Serial Port Profile) pour la communication série via Bluetooth lorsque bluetoothd est démarré. Vous devez démarrer bluetoothd '' avec l'option --compat (ou -C) avant de pouvoir utiliser
sdptool``.
Créez un nouveau fichier sous / 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 '' écoute une connexion série, et une fois connecté, il crée un périphérique RFCOMM (/ dev / rfcommX) et exécute la commande spécifiée (démarre un processus enfant). En spécifiant d'exécuter `ʻagetty
ici et en lui passant / dev / rfcommX, l'invite de connexion sera affichée à la source série.
De plus, bien que ce soit un peu hors sujet, il y a un article qui explique que modifier le fichier d'unité de systemd consiste à éditer le fichier sous `` / usr / lib / systemd / system / '', mais la méthode est ** fausse. **est. (Les fichiers sous ce répertoire peuvent être mis à jour lors de la mise à jour de systemd)
Référence: [Guide de l'administrateur système Red Hat Enterprise Linux 7 / 10.6.4. Modification des fichiers d'unité existants](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)
Pour revenir à l'histoire, une fois que les deux fichiers ci-dessus ont été créés, ils seront reflétés et activés dans systemd.
# systemd daemon-reload
# systemd enable [email protected]
Ensuite, créez un nouveau fichier de règles sous /etc/udev/rules.d/.
config:/etc/udeb/rules.d/90-rfcomm.rules
KERNEL=="rfcomm[0-9]*", ENV{ID_MM_DEVICE_IGNORE}="1"
Si vous ne le faites pas, ModemManager réagira au fichier de périphérique RFCOMM / dev / rfcomm0 créé lorsque vous établissez une connexion Bluetooth à partir du terminal et enverra des données qui ressemblent à une commande AT au terminal (cela est étrange à l'invite de connexion). Les caractères interrompent).
Vous pouvez utiliser systemd {stop, disable} ModemManager
, mais comme c'est un service qui est activé par défaut, j'ai ajouté une règle d'exclusion pour ne pas devenir accro à tout moment.
À la suite de diverses recherches liées à SELinux cette fois-ci, j'ai pu faire un pas de "Je déteste ne pas manger SELinux". Pour ceux qui n'aiment pas manger comme moi, j'aimerais écrire plus en détail dans les montagnes, mais je vais l'omettre car le volume augmentera trop.
Dans un environnement compatible SELinux, le lancement manuel de rfcomm
à partir du shell fonctionnait bien, mais lorsque j'ai essayé de le lancer en tant que démon depuis systemd, cela ne fonctionnait pas. Après avoir enquêté sur la cause, nous avons trouvé ce qui suit.
rfcomm
) est donné par "transition de domaine".
-Peut-être parce qu'il n'est pas censé lancer et utiliser `ʻagetty`` à partir du processus du domaine" bluetooth_t ", il n'y a pas de politique pour permettre une telle opération par défaut. S'il n'y a pas de politique SELinux correspondante, je la créerai moi-même, donc je l'ai régulièrement écrasée en utilisant la commande `ʻausearch`` en mode Permissif. Le contenu de la politique créée est à peu près les quatre points suivants.
rfcomm
à générer des processus enfants rfcomm
lance ```agetty`` en tant que processus enfant, il passera son domaine à "getty_t". rfcomm
et ```agetty``Parmi ceux-ci, le point le plus important est 2.
L'accès aux ressources liées à la connexion à partir du processus `ʻagettyest bien sûr autorisé par défaut. Cependant, dans ce cas, l'opération est rejetée. Ceci est dû au fait que le processus «agetty» s'exécute dans le domaine «bluetooth_t» dans ce cas, même si la politique d'autorisation est définie sur l'hypothèse que le processus «agetty» s'exécute dans le domaine «getty_t». (Parce que le processus enfant prend le contrôle du domaine du processus parent, cela se produira lorsque
rfcomm dans le domaine "bluetooth_t" démarre ```agetty
).
Normalement, lors de la création d'une politique SELinux, mettez-la en mode Permissif et utilisez la commande `ʻausearch`` pour écrire une règle qui permet à SELinux d'effectuer les actions rejetées une par une dans le journal d'audit. Mais si vous faites cela directement dans ce cas, vous finissez par permettre aux processus du domaine "bluetooth_t" d'accéder aux ressources liées à la connexion. Vous allez probablement écrire beaucoup de règles, et cela ne semble pas bon pour la sécurité.
Donc, j'écris une règle de transition de domaine pour que lorsque rfcomm
lance `ʻagetty``, le processus soit lancé dans le domaine d'origine" getty_t ".
Cela permettra à «agetty» de fonctionner selon la politique d'autorisation par défaut.
Eh bien, l'explication est longue, mais c'est comment créer et appliquer une politique.
Installez le package selinux-policy-devel, qui est requis pour générer le fichier de stratégie SELinux.
# yum install selinux-policy-devel
En outre, créez un fichier te (Type Enforcement) qui constitue la base du fichier de stratégie. L'emplacement est correct n'importe où, mais provisoirement c'est / root / selinux /. L'exécution de `` make '' générera plusieurs fichiers, y compris le répertoire, il est donc préférable de créer un nouveau répertoire dédié.
/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 };
Générez un fichier pp (Policy Package) à partir de ce fichier te que vous avez créé et appliquez la stratégie.
# 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
J'obtiens une erreur, mais ce n'est pas grave si rfcomm-getty.pp est généré.
Installez la politique générée par `` semodule -i ''.
# semodule -i rfcomm-getty.pp
À ce stade, redémarrez la machine et la console série doit être en mode veille via Bluetooth.
À partir de là, la procédure consiste à coupler le terminal à connecter à la machine Linux et à se connecter avec la console série.
Afin d'établir une connexion de console série via Bluetooth, il est nécessaire de coupler au préalable la machine Linux et le terminal. À l'inverse, cela signifie que vous ne pouvez pas vous connecter à une console série via Bluetooth à partir d'un terminal qui n'a pas été couplé au préalable.
Pour que les appareils puissent communiquer entre eux via Bluetooth, ils doivent d'abord être couplés. Après avoir rendu un appareil détectable à partir des appareils environnants, l'autre appareil enverra une demande de couplage à cet appareil.
Voici un exemple de couplage depuis une machine Windows 10. [^ 4]
[^ 4]: Au contraire, je pense que cela peut être utilisé de la même manière même si vous passez à l'appairage du côté machine Linux (non vérifié), mais je pense que c'est plus facile en termes de procédure.
Tout d'abord, rendez la machine Linux détectable à partir de `` bluetoothctl ''.
# 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
Tapez `` show '' à l'invite bluetoothctl pour voir les informations du contrôleur. Si vous confirmez que "Powered: yes" et "Pairable: yes" sont définis et définis sur "Discoverable on", la machine Linux sera détectable par Bluetooth pendant 3 minutes par défaut.
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller XX:XX:XX:XX:XX:XX Discoverable: yes
[bluetooth]#
Si «Pairable: no» est défini, l'appairage échouera même s'il peut être trouvé. L'appairage est possible avec `` appairable on ''.
L'appairage est effectué du côté de la machine terminale pendant qu'il est détectable.
Décrit comment appairer à partir d'un ordinateur Windows. Bien sûr, la procédure est différente, mais vous pouvez vous connecter à partir d'un autre système d'exploitation.
Cela devrait terminer l'appairage (l'invite `` bluetoothctl '' du côté Linux montrera également que l'appairage est terminé).
En outre, vérifiez l'affectation du port série. Si vous vous associez avec SPP activé, deux ports COM vous seront automatiquement attribués (entrant et sortant).
Vous pouvez vous connecter à la console série en ouvrant ici le port affecté à «Sortant» (COM4 dans cet exemple).
Le moyen le plus rapide d'ouvrir un port COM est d'utiliser le Tera Term, que vous utilisez probablement tout le temps.
Lors de la connexion avec SSH, spécifiez le nom d'hôte et le port, mais sélectionnez «Série», sélectionnez le port COM et cliquez sur «OK». seulement ça. Vous devriez voir une invite de connexion à l'écran.
Lors de la connexion via Bluetooth à partir du terminal, le journal des erreurs suivant est généré.
/dev/rfcomm0: cannot get controlling tty:C'est une opération qui n'est pas autorisée
/dev/rfcomm0: cannot get controlling tty:C'est une opération qui n'est pas autorisée
/dev/rfcomm0: cannot set process group:Ioctl inapproprié pour l'appareil
Je ne comprends toujours pas les choses autour de TTY ...
Si vous connaissez la cause, faites-le moi savoir!
Ce sont les sites et articles auxquels j'ai fait référence. Merci beaucoup.
J'utilise une application de terminal appelée ConnectBot sur Android, mais cette application ne prend pas en charge la connexion série comme Tera Term.
Si vous recherchez "Bluetooth série" dans le Play Store, vous trouverez de nombreuses applications de terminal Bluetooth, mais aucune d'entre elles n'est aussi facile à utiliser que celles que vous utilisez tout le temps.
Donc! Une application appelée "Bluetooth Bridge (+ TCP)" apparaîtra.
Ceci est une application qui relie la communication entre deux Bluetooth ou TCP. L'un est une connexion série Bluetooth, l'autre est un serveur TCP qui écoute sur n'importe quel port pour relier la communication bidirectionnelle, puis à partir de l'application de terminal habituelle, Telnet vers le port spécifié de localhost est OK!
Je ne suis pas fan de cette application, mais c'était un bon travail, alors je l'ai présentée.