Satria (Diskussion | Beiträge) |
Satria (Diskussion | Beiträge) (Arrays) |
||
(18 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
<pre>cat /proc/version</pre> | <pre>cat /proc/version</pre> | ||
<pre>cat /etc/*release</pre> | <pre>cat /etc/*release</pre> | ||
+ | <pre>lsb_release -da</pre> | ||
+ | |||
+ | == RAID Laufwerk(e) mounten == | ||
+ | === Gerätenamen ermitteln === | ||
+ | Mit | ||
+ | |||
+ | <pre>cat /proc/partitions</pre> | ||
+ | |||
+ | und / oder mit | ||
+ | |||
+ | <pre>fdisk -l</pre> | ||
+ | |||
+ | kann herausgefunden werden, wie die Festplatte bzw. die Partition heißt, die man mounten möchte. Normalerweise heißen sie /dev/sda oder /dev/sdb, und die Partitionen dann /dev/sda1, /dev/sda2 usw. | ||
+ | |||
+ | === Assemblen === | ||
+ | RAID Partitionen müssen in Linux "assembled" werden. Auch eine einzelne (degraded) Partition. Das geht mit dem Kommando: | ||
+ | |||
+ | <pre>mdadm --assemble /dev/md5 /dev/sda3 --run</pre> | ||
+ | |||
+ | angenommen, man möchte die einzelne Partition sda3 in das device md5 assemblen. (Normalerweise würde man aber 2 Partitionen (bei RAID 1) zusammen in das device md5 assemblen!) | ||
+ | |||
+ | === Mounten === | ||
+ | Angenommen, das Verzeichnis /mnt/HDD existiert bereits (und ist leer), dann wird das RAID array wie folgt (schreibgeschützt, -r) hier rein gemounted: | ||
+ | mount -r /dev/md5 /mnt/HDD | ||
+ | |||
+ | Nun kann man auf den Inhalt des RAID arrays im Verzeichnis /mnt/HDD zugreifen. | ||
+ | |||
+ | Für ein automatisches Mounten beim booten, editiet man die /etc/fstab und fügt z.B. für eine CIFS Freigabe Folgendes hinzu: | ||
+ | //<NAS-IP>/nfs /mnt/remote_nfs cifs username=user,password=secret,file_mode=0777,dir_mode=0777 0 0 | ||
+ | Alternativ kann auch eine Datei mit den Logindaten referenziert werden: | ||
+ | //<NAS-IP>/nfs /mnt/remote_nfs cifs credentials=/etc/.smbcred,file_mode=0777,dir_mode=0777 0 0 | ||
+ | wobei die Datei /etc/.smbcred so aussieht: | ||
+ | username=user | ||
+ | password=secret | ||
+ | und am besten nur root zugänglich gemacht wird (chmod 600) | ||
+ | |||
+ | == Mounten == | ||
+ | === USB HDD === | ||
+ | Wir listen erst einmal alle angeschlossenen Datenträger auf: | ||
+ | lsblk -d | ||
+ | Das Ergebnis sei z.B.: | ||
+ | <pre> | ||
+ | NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS | ||
+ | sda | ||
+ | ├─sda1 | ||
+ | └─sda5 ntfs Transfer C826D3B026D69F2E | ||
+ | mmcblk0 | ||
+ | ├─mmcblk0p1 vfat FAT32 bootfs 483F-05A0 379,3M 26% /boot/firmware | ||
+ | └─mmcblk0p2 ext4 1.0 rootfs ee354f68-c22f-48b7-a81c-43ae87c280f8 23,3G 11% / | ||
+ | </pre> | ||
+ | In dem Fall würde die Festplatte mit dem Label "Transfer" so gemounted: | ||
+ | sudo mkdir /media/Transfer | ||
+ | sudo mount -t ntfs /dev/disk/by-uuid/C826D3B026D69F2E /media/Transfer/ | ||
+ | |||
+ | === Ein Dateisystem beschreibbar remounten === | ||
+ | sudo mount -o remount,rw /partition/identifier /mount/point | ||
+ | |||
+ | == Prozesse im Hintergrund == | ||
+ | Um auch unter SSH vom Multitasking zu profitieren oder sich sogar ausloggen zu können (SSH disconnect), gibt es verschiedene Möglichkeiten. | ||
+ | |||
+ | === Einen Task starten === | ||
+ | Wenn man ein Kommando ausführt, von dem man schon vorher weiß, dass es unabhängig von der session laufen soll, gibt es den Befehl <code>nohup</code>, der das zu startende Programm im Hintergrund ausführt. Ein Kopiervorgang z.B. würde so gestartet werden: | ||
+ | |||
+ | ==== Variante 1 ==== | ||
+ | <pre>nohup cp /source /target &</pre> | ||
+ | |||
+ | ==== Variante 2 ==== | ||
+ | Ohne nohup soll das auch so gehen: | ||
+ | |||
+ | <pre>cp /source /target & >/dev/null 2>/dev/null ; disown; </pre> | ||
+ | |||
+ | ==== Variante 3 ==== | ||
+ | Eine wohl noch bessere Möglichkeit ist <code>setsid</code>: | ||
+ | |||
+ | <pre>setsid cp /source /target</pre> | ||
+ | |||
+ | === Bereits laufende Tasks === | ||
+ | Ein Task, der bereits läuft und die SSH "blockiert", weil auf das Beenden gewartet wird, kann wie folgt in den Hintergrund verschoben und unabhängig von der SSH session gemacht werden: | ||
+ | |||
+ | <pre> | ||
+ | Ctrl.+Z | ||
+ | bg | ||
+ | disown | ||
+ | </pre> | ||
+ | |||
+ | == Shell-Tricks == | ||
+ | === Dateinamen aus Pfad ermitteln === | ||
+ | Hierfür gibt es eine built-in Funktion: | ||
+ | <pre> | ||
+ | Pfad=/Test/Datei.Ext | ||
+ | Dateiname=$(basename "$Pfad") | ||
+ | </pre> | ||
+ | liefert ''Datei.Ext'' | ||
+ | |||
+ | === Extension aus Dateinamen ermitteln === | ||
+ | <pre> | ||
+ | Dateiname=Datei.Name.Ext | ||
+ | Extension=${Dateiname##*.} | ||
+ | </pre> | ||
+ | liefert ''Ext'' | ||
+ | |||
+ | === JSON zu einer Variable zuweisen === | ||
+ | Wegen Schwierigkeiten mit Single und Double-quotes, Escaping und möglicher Variablen, die aufgelöst werden sollen, ist das hier die beste und leserlichste Methode: | ||
+ | <pre> | ||
+ | JSON_VAR=$(cat <<EOF | ||
+ | { | ||
+ | "Eigenschaft1": "Wert1", | ||
+ | "Eigenschaft2": "${VAR2}" | ||
+ | } | ||
+ | EOF | ||
+ | ) | ||
+ | </pre> | ||
+ | |||
+ | === Array in Variable speichern === | ||
+ | Normalerweise können Linux Umgebungsvariablen nur einen Wert speichern. Mit dem Kommando | ||
+ | <pre>IFS=',' -ra OUTPUT_VAR <<< "${INPUT_VAR}"</pre> | ||
+ | kann aber aus einem Wert wie "a,b,c" ein echtes Array | ||
+ | <pre> | ||
+ | a | ||
+ | b | ||
+ | c | ||
+ | </pre> | ||
+ | erzeugt werden. | ||
+ | Auf das Array kann dann z.B. so zugegriffen werden: | ||
+ | <pre> | ||
+ | for i in "${OUTPUT_VAR[@]}"; do | ||
+ | echo ${i} | ||
+ | done | ||
+ | </pre> | ||
+ | Aber auch ohne diesen Umweg kann ein Array definiert werden, und das sieht dann so aus: | ||
+ | <pre>ARRAY_VAR=([0]="a" [1]="b" [2]="c")</pre> | ||
== Absturz via Shell == | == Absturz via Shell == | ||
Zeile 11: | Zeile 142: | ||
Wer die Zeile erklären kann, bitte posten :) | Wer die Zeile erklären kann, bitte posten :) | ||
<pre>:(){ :|:& } ;:</pre> | <pre>:(){ :|:& } ;:</pre> | ||
+ | |||
+ | == WLAN konfigurieren == | ||
+ | (Bezieht sich auf Raspbian) | ||
+ | |||
+ | === wpa_supplicant.conf === | ||
+ | Mit diesem Befehl fügt man WLAN Konfigurationen zum System hinzu: | ||
+ | <pre> | ||
+ | sudo -i | ||
+ | wpa_passphrase "WLAN-NAME" "WLAN-PASSWORT" >> /etc/wpa_supplicant/wpa_supplicant.conf | ||
+ | </pre> | ||
+ | Der PSK wird unverschlüsselt und verschlüsselt in diese Datei geschrieben. Der (auskommentierte) unverschlüsselte Teil kann und sollte gelöscht werden. | ||
+ | |||
+ | Für versteckte WLANs muss dem eintrag noch ein <code>scan_ssid=1</code> hinzugefügt werden! | ||
+ | |||
+ | Außerdem sollte <code>country=DE</code> korrekt gesetzt werden. | ||
+ | |||
+ | Danach sieht die Datei dann in etwa so aus: | ||
+ | <pre> | ||
+ | ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev | ||
+ | update_config=1 | ||
+ | country=DE | ||
+ | |||
+ | network={ | ||
+ | ssid="WLAN_SSID" | ||
+ | scan_ssid=1 | ||
+ | psk=3458f3thjg89dg89765t95jh4kttljgl934053ujlke83455 | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | === /etc/network/interfaces === | ||
+ | Diese Datei solle ungefähr so aussehen: | ||
+ | <pre> | ||
+ | auto lo | ||
+ | iface lo inet loopback | ||
+ | |||
+ | auto eth0 | ||
+ | iface eth0 inet dhcp | ||
+ | |||
+ | allow-hotplug wlan0 | ||
+ | iface wlan0 inet dhcp | ||
+ | wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf | ||
+ | </pre> | ||
+ | Testweise mit dem WLAN verbinden kann man sich so: | ||
+ | <pre>sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf</pre> | ||
+ | |||
+ | Nach einem Neustart sollte sich Raspbian aber dann von selbst verbinden. | ||
+ | |||
+ | WLAN Verbindung prüfen: | ||
+ | <pre>sudo systemctl status wpa_supplicant@wlan0.service</pre> | ||
+ | |||
+ | === mode DORMANT === | ||
+ | Mit | ||
+ | <pre>ip l</pre> | ||
+ | kann man sich den Status aller Netzwerkadapter anzeigen lassen. Es kann vorkommen, dass bei wlan0 "mode DORMANT" steht, was so etwas wie "inaktiv" bedeutet. | ||
+ | |||
+ | Aktiviern lässt es sich so: | ||
+ | <pre>ip link set wlan0 mode default</pre> | ||
+ | |||
+ | == Quellen == | ||
+ | https://homeforum.zyxel.com/discussion/679/new-nas-old-hdds-how-to | ||
+ | |||
+ | https://askubuntu.com/questions/8653/how-to-keep-processes-running-after-ending-ssh-session | ||
+ | |||
+ | https://serverfault.com/questions/344509/ssh-run-command-in-background-disconnect | ||
+ | |||
+ | https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/ | ||
+ | |||
+ | https://www.elektronik-kompendium.de/sites/raspberry-pi/1912221.htm |
Aktuelle Version vom 27. Mai 2024, 08:46 Uhr
Inhaltsverzeichnis
Linux-Version ermitteln
Es gibt verschiedene Kommandos, die über die verwendete Linuxversion Aufschluss geben:
uname -a
cat /proc/version
cat /etc/*release
lsb_release -da
RAID Laufwerk(e) mounten
Gerätenamen ermitteln
Mit
cat /proc/partitions
und / oder mit
fdisk -l
kann herausgefunden werden, wie die Festplatte bzw. die Partition heißt, die man mounten möchte. Normalerweise heißen sie /dev/sda oder /dev/sdb, und die Partitionen dann /dev/sda1, /dev/sda2 usw.
Assemblen
RAID Partitionen müssen in Linux "assembled" werden. Auch eine einzelne (degraded) Partition. Das geht mit dem Kommando:
mdadm --assemble /dev/md5 /dev/sda3 --run
angenommen, man möchte die einzelne Partition sda3 in das device md5 assemblen. (Normalerweise würde man aber 2 Partitionen (bei RAID 1) zusammen in das device md5 assemblen!)
Mounten
Angenommen, das Verzeichnis /mnt/HDD existiert bereits (und ist leer), dann wird das RAID array wie folgt (schreibgeschützt, -r) hier rein gemounted:
mount -r /dev/md5 /mnt/HDD
Nun kann man auf den Inhalt des RAID arrays im Verzeichnis /mnt/HDD zugreifen.
Für ein automatisches Mounten beim booten, editiet man die /etc/fstab und fügt z.B. für eine CIFS Freigabe Folgendes hinzu:
//<NAS-IP>/nfs /mnt/remote_nfs cifs username=user,password=secret,file_mode=0777,dir_mode=0777 0 0
Alternativ kann auch eine Datei mit den Logindaten referenziert werden:
//<NAS-IP>/nfs /mnt/remote_nfs cifs credentials=/etc/.smbcred,file_mode=0777,dir_mode=0777 0 0
wobei die Datei /etc/.smbcred so aussieht:
username=user password=secret
und am besten nur root zugänglich gemacht wird (chmod 600)
Mounten
USB HDD
Wir listen erst einmal alle angeschlossenen Datenträger auf:
lsblk -d
Das Ergebnis sei z.B.:
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sda ├─sda1 └─sda5 ntfs Transfer C826D3B026D69F2E mmcblk0 ├─mmcblk0p1 vfat FAT32 bootfs 483F-05A0 379,3M 26% /boot/firmware └─mmcblk0p2 ext4 1.0 rootfs ee354f68-c22f-48b7-a81c-43ae87c280f8 23,3G 11% /
In dem Fall würde die Festplatte mit dem Label "Transfer" so gemounted:
sudo mkdir /media/Transfer sudo mount -t ntfs /dev/disk/by-uuid/C826D3B026D69F2E /media/Transfer/
Ein Dateisystem beschreibbar remounten
sudo mount -o remount,rw /partition/identifier /mount/point
Prozesse im Hintergrund
Um auch unter SSH vom Multitasking zu profitieren oder sich sogar ausloggen zu können (SSH disconnect), gibt es verschiedene Möglichkeiten.
Einen Task starten
Wenn man ein Kommando ausführt, von dem man schon vorher weiß, dass es unabhängig von der session laufen soll, gibt es den Befehl nohup
, der das zu startende Programm im Hintergrund ausführt. Ein Kopiervorgang z.B. würde so gestartet werden:
Variante 1
nohup cp /source /target &
Variante 2
Ohne nohup soll das auch so gehen:
cp /source /target & >/dev/null 2>/dev/null ; disown;
Variante 3
Eine wohl noch bessere Möglichkeit ist setsid
:
setsid cp /source /target
Bereits laufende Tasks
Ein Task, der bereits läuft und die SSH "blockiert", weil auf das Beenden gewartet wird, kann wie folgt in den Hintergrund verschoben und unabhängig von der SSH session gemacht werden:
Ctrl.+Z bg disown
Shell-Tricks
Dateinamen aus Pfad ermitteln
Hierfür gibt es eine built-in Funktion:
Pfad=/Test/Datei.Ext Dateiname=$(basename "$Pfad")
liefert Datei.Ext
Extension aus Dateinamen ermitteln
Dateiname=Datei.Name.Ext Extension=${Dateiname##*.}
liefert Ext
JSON zu einer Variable zuweisen
Wegen Schwierigkeiten mit Single und Double-quotes, Escaping und möglicher Variablen, die aufgelöst werden sollen, ist das hier die beste und leserlichste Methode:
JSON_VAR=$(cat <<EOF { "Eigenschaft1": "Wert1", "Eigenschaft2": "${VAR2}" } EOF )
Array in Variable speichern
Normalerweise können Linux Umgebungsvariablen nur einen Wert speichern. Mit dem Kommando
IFS=',' -ra OUTPUT_VAR <<< "${INPUT_VAR}"
kann aber aus einem Wert wie "a,b,c" ein echtes Array
a b c
erzeugt werden. Auf das Array kann dann z.B. so zugegriffen werden:
for i in "${OUTPUT_VAR[@]}"; do echo ${i} done
Aber auch ohne diesen Umweg kann ein Array definiert werden, und das sieht dann so aus:
ARRAY_VAR=([0]="a" [1]="b" [2]="c")
Absturz via Shell
Gitb man folgenden Befehls-String in eine Linux-Console ein, friert das System augenblicklich ein. Es kann durchaus auch eine Console im Fenster sein.
Wer die Zeile erklären kann, bitte posten :)
:(){ :|:& } ;:
WLAN konfigurieren
(Bezieht sich auf Raspbian)
wpa_supplicant.conf
Mit diesem Befehl fügt man WLAN Konfigurationen zum System hinzu:
sudo -i wpa_passphrase "WLAN-NAME" "WLAN-PASSWORT" >> /etc/wpa_supplicant/wpa_supplicant.conf
Der PSK wird unverschlüsselt und verschlüsselt in diese Datei geschrieben. Der (auskommentierte) unverschlüsselte Teil kann und sollte gelöscht werden.
Für versteckte WLANs muss dem eintrag noch ein scan_ssid=1
hinzugefügt werden!
Außerdem sollte country=DE
korrekt gesetzt werden.
Danach sieht die Datei dann in etwa so aus:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=DE network={ ssid="WLAN_SSID" scan_ssid=1 psk=3458f3thjg89dg89765t95jh4kttljgl934053ujlke83455 }
/etc/network/interfaces
Diese Datei solle ungefähr so aussehen:
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Testweise mit dem WLAN verbinden kann man sich so:
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
Nach einem Neustart sollte sich Raspbian aber dann von selbst verbinden.
WLAN Verbindung prüfen:
sudo systemctl status wpa_supplicant@wlan0.service
mode DORMANT
Mit
ip l
kann man sich den Status aller Netzwerkadapter anzeigen lassen. Es kann vorkommen, dass bei wlan0 "mode DORMANT" steht, was so etwas wie "inaktiv" bedeutet.
Aktiviern lässt es sich so:
ip link set wlan0 mode default
Quellen
https://homeforum.zyxel.com/discussion/679/new-nas-old-hdds-how-to
https://askubuntu.com/questions/8653/how-to-keep-processes-running-after-ending-ssh-session
https://serverfault.com/questions/344509/ssh-run-command-in-background-disconnect
https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
https://www.elektronik-kompendium.de/sites/raspberry-pi/1912221.htm