Linux: Unterschied zwischen den Versionen

Aus SatriaWiki
 
(25 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 ==
 
== RAID Laufwerk(e) mounten ==
Zeile 27: Zeile 28:
 
=== Mounten ===
 
=== Mounten ===
 
Angenommen, das Verzeichnis /mnt/HDD existiert bereits (und ist leer), dann wird das RAID array wie folgt (schreibgeschützt, -r) hier rein gemounted:
 
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
  
<pre>mount -r /dev/md5 /mnt/HDD</pre>
+
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)
 +
 
 +
== Datenträger ==
 +
=== USB HDD ===
 +
Wir listen erst einmal alle angeschlossenen Datenträger auf:
 +
  lsblk -o NAME,LABEL,UUID,FSTYPE,FSVER,FSAVAIL,FSUSE%,MOUNTPOINTS
 +
Das Ergebnis sei z.B.:
 +
<pre>
 +
NAME        LABEL    UUID                                FSTYPE FSVER FSAVAIL FSUSE% MOUNTPOINTS
 +
sda
 +
└─sda1      Transfer  19cf2678-e686-45df-b6a6-aa6411bfe008 ext4  1.0
 +
mmcblk0
 +
├─mmcblk0p1 bootfs    4EF5-6F55                            vfat  FAT32  455,3M    11% /boot/firmware
 +
└─mmcblk0p2 rootfs    ce208fd3-38a8-424a-87a2-cd44114eb820 ext4  1.0    51,1G    8% /
 +
</pre>
 +
In dem Fall würde die Festplatte mit dem Label "Transfer" so gemounted:
 +
  sudo mkdir /media/Transfer
 +
  sudo mount -t ext4 /dev/disk/by-uuid/19cf2678-e686-45df-b6a6-aa6411bfe008 /media/Transfer/
 +
 
 +
=== Automount ===
 +
In der Date /etc/fstab wird diese Zeile hinzugefügt:
 +
  UUID=19cf2678-e686-45df-b6a6-aa6411bfe008  /media/Transfer  ext4  defaults,noatime  0 2
 +
;noatime:Verhindert das zyklische Aktualisieren des "last accessed" Zeitstempels
 +
;0:Dieses Dateisystem ist von einem "dump" ausgenommen
 +
;2:Dieses Dateisystem wird beim Booten gecheckt, aber nach root.
 +
 
 +
=== Ein Dateisystem beschreibbar remounten ===
 +
sudo mount -o remount,rw /partition/identifier /mount/point
  
Nun kann man auf den Inhalt des RAID arrays im Verzeichnis /mnt/HDD zugreifen.
+
=== Partitionieren / Formatieren ===
 +
Während normalerweise fdisk ausreicht, muss man für Partitionen > 2TB '''parted''' verwenden, das noch weniger intuitiv ist als fdisk. Es existiert eine Hilfe, aber dennoch ein Tipp:
 +
 
 +
Will man den maximalen Platz für eine Partition nutzen, gibt man für ENDE '''100%''' ein.
  
 
== Prozesse im Hintergrund ==
 
== Prozesse im Hintergrund ==
Zeile 46: Zeile 87:
 
<pre>cp /source /target & >/dev/null 2>/dev/null ; disown; </pre>
 
<pre>cp /source /target & >/dev/null 2>/dev/null ; disown; </pre>
  
=== Variante 3 ===
+
==== Variante 3 ====
 
Eine wohl noch bessere Möglichkeit ist <code>setsid</code>:
 
Eine wohl noch bessere Möglichkeit ist <code>setsid</code>:
  
<pre>setsip cp /source /target</pre>
+
<pre>setsid cp /source /target</pre>
  
 
=== Bereits laufende Tasks ===
 
=== Bereits laufende Tasks ===
Zeile 59: Zeile 100:
 
disown
 
disown
 
</pre>
 
</pre>
 +
 +
=== Periodische Tasks ===
 +
Mit
 +
  crontab -e
 +
editiert man die periodischen Tasks, die automatisch vom System ausgeführt werden. Die temporäre Datei, die im Editor geöffnet wird, kann einfach überschrieben werden, cron nimmt sie sich anschließend und aktualisiert im Hintergrund die Task liste.
 +
 +
Mit
 +
  crontab -l
 +
ruft man sich die Liste aller derzeit geplanten Tasks ab.
 +
 +
== 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 65: Zeile 162:
 
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>
 +
 +
== LDAP Server ==
 +
Ein LDAP Server lässt sich per
 +
  sudo apt install slapd ldap-utils
 +
installieren und am einfachsten durch phpLDAPAdmin verwalten. Der service heißt "'''slapd'''".
 +
 +
Einige wichtige Kommandos sind:
 +
;slapcat:Zeigt Informationen über den Server an
 +
;dpkg-reconfigure slapd:Neukonfigurieren des Servers (am besten, wenn keine Daten behalten werden müssen)
 +
;ldapsearch:Einträge im LDAP Verzeichnis suchen
 +
;ldappasswd:Das Passwort eines LDAP Benutzers ändern
 +
;net getlocalsid:Die SID des Systems abfragen. Wichtig für das Bilden von Benutzer-SIDs
 +
 +
== SAMBA Server ==
 +
Ein SAMBA-Server (Windows-Freigaben) lässt sich per
 +
  sudo apt-get install -y samba samba-common smbclient
 +
installieren. Es werden 2 Serivces installiert: smbd und nmbd
 +
 +
Eine SAMBA-Freigabe unterstützt diese Eigenschaften:
 +
<pre>
 +
  available = yes/no
 +
  path = /path
 +
  valid users = user1,user2,user3,user4,@group1,@group2
 +
  invalid users = guest
 +
  admin users = user1,user2
 +
  read only = yes/no
 +
  read list = user3,user4,@group2
 +
  write list = user1,user2,@group1
 +
  browseable = yes/no
 +
  public = yes/no
 +
  guest ok = yes/no
 +
  create mask = 0660
 +
  directory mask = 0770
 +
  force user = user1
 +
  force group = @group1
 +
  force create mode = 0660
 +
  force directory mode = 2770
 +
  delete readonly = yes/no
 +
  locking = yes/no
 +
  hide unreadable = yes/no
 +
  hide files = *.bak,*.tmp
 +
  caching = yes/no
 +
 +
  store dos attributes = yes/no
 +
  nt acl support = yes/no
 +
  vfs objects = acl_xattr
 +
</pre>
 +
veraltet:
 +
<pre>
 +
  writeable = yes
 +
</pre>
 +
Einige wichtige Kommandos sind:
 +
;pdbedit:Verwaltet Benutzer und Passwörter
 +
;smbpasswd:Ändert das Passwort eines SAMBA-Benutzers
 +
;testparm:Listet die aktuell geladene Konfiguration auf
  
 
== Quellen ==
 
== Quellen ==
Zeile 74: Zeile 283:
  
 
https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
 
https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
 +
 +
https://www.elektronik-kompendium.de/sites/raspberry-pi/1912221.htm

Aktuelle Version vom 11. März 2025, 11:52 Uhr

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)

Datenträger

USB HDD

Wir listen erst einmal alle angeschlossenen Datenträger auf:

 lsblk -o NAME,LABEL,UUID,FSTYPE,FSVER,FSAVAIL,FSUSE%,MOUNTPOINTS

Das Ergebnis sei z.B.:

NAME        LABEL     UUID                                 FSTYPE FSVER FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1      Transfer  19cf2678-e686-45df-b6a6-aa6411bfe008 ext4   1.0
mmcblk0
├─mmcblk0p1 bootfs    4EF5-6F55                            vfat   FAT32  455,3M    11% /boot/firmware
└─mmcblk0p2 rootfs    ce208fd3-38a8-424a-87a2-cd44114eb820 ext4   1.0     51,1G     8% /

In dem Fall würde die Festplatte mit dem Label "Transfer" so gemounted:

 sudo mkdir /media/Transfer
 sudo mount -t ext4 /dev/disk/by-uuid/19cf2678-e686-45df-b6a6-aa6411bfe008 /media/Transfer/

Automount

In der Date /etc/fstab wird diese Zeile hinzugefügt:

 UUID=19cf2678-e686-45df-b6a6-aa6411bfe008  /media/Transfer  ext4  defaults,noatime  0 2
noatime
Verhindert das zyklische Aktualisieren des "last accessed" Zeitstempels
0
Dieses Dateisystem ist von einem "dump" ausgenommen
2
Dieses Dateisystem wird beim Booten gecheckt, aber nach root.

Ein Dateisystem beschreibbar remounten

sudo mount -o remount,rw /partition/identifier /mount/point

Partitionieren / Formatieren

Während normalerweise fdisk ausreicht, muss man für Partitionen > 2TB parted verwenden, das noch weniger intuitiv ist als fdisk. Es existiert eine Hilfe, aber dennoch ein Tipp:

Will man den maximalen Platz für eine Partition nutzen, gibt man für ENDE 100% ein.

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

Periodische Tasks

Mit

 crontab -e

editiert man die periodischen Tasks, die automatisch vom System ausgeführt werden. Die temporäre Datei, die im Editor geöffnet wird, kann einfach überschrieben werden, cron nimmt sie sich anschließend und aktualisiert im Hintergrund die Task liste.

Mit

 crontab -l

ruft man sich die Liste aller derzeit geplanten Tasks ab.

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

LDAP Server

Ein LDAP Server lässt sich per

 sudo apt install slapd ldap-utils

installieren und am einfachsten durch phpLDAPAdmin verwalten. Der service heißt "slapd".

Einige wichtige Kommandos sind:

slapcat
Zeigt Informationen über den Server an
dpkg-reconfigure slapd
Neukonfigurieren des Servers (am besten, wenn keine Daten behalten werden müssen)
ldapsearch
Einträge im LDAP Verzeichnis suchen
ldappasswd
Das Passwort eines LDAP Benutzers ändern
net getlocalsid
Die SID des Systems abfragen. Wichtig für das Bilden von Benutzer-SIDs

SAMBA Server

Ein SAMBA-Server (Windows-Freigaben) lässt sich per

 sudo apt-get install -y samba samba-common smbclient

installieren. Es werden 2 Serivces installiert: smbd und nmbd

Eine SAMBA-Freigabe unterstützt diese Eigenschaften:

  available = yes/no
  path = /path
  valid users = user1,user2,user3,user4,@group1,@group2
  invalid users = guest
  admin users = user1,user2
  read only = yes/no
  read list = user3,user4,@group2
  write list = user1,user2,@group1
  browseable = yes/no
  public = yes/no
  guest ok = yes/no
  create mask = 0660
  directory mask = 0770
  force user = user1
  force group = @group1
  force create mode = 0660
  force directory mode = 2770
  delete readonly = yes/no
  locking = yes/no
  hide unreadable = yes/no
  hide files = *.bak,*.tmp
  caching = yes/no

  store dos attributes = yes/no
  nt acl support = yes/no
  vfs objects = acl_xattr

veraltet:

  writeable = yes

Einige wichtige Kommandos sind:

pdbedit
Verwaltet Benutzer und Passwörter
smbpasswd
Ändert das Passwort eines SAMBA-Benutzers
testparm
Listet die aktuell geladene Konfiguration auf

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