Hardware unter Linux
Linux Hardware-Tipps
Hardware-Tests
Immer öfter haben „Billig“ PCs auch billige Hardware eingebaut. Um sicher zu gehen, ob die Hardware okay ist, gibt es kleine Helfer, wie im folgenden gezeigt:
RAM-Test mit memtest86+
Mit memtest86+ kann man den RAM auf Herz und Nieren prüfen. Auf der Internetseite bekommt man u.a. ISO Images zum Erstellen einer bootfähigen CD.
Bei Ubuntu ist dieser RAM - Test auch im GRUB Bootloader als Menupunkt vorhanden.
Festplatten-Test mit badblocks
Mit badblocks kann man die Festplatte testen. Dies sollte man jedoch mit einem Rettungssystem tun. Zum Beispiel hiermit: http://www.sysresccd.org/Main_Page
Lesetest der gesamten Festplatte:
# badblocks -sv /dev/sda
Schreibtest mit !! ZERSTÖRUNG !! der Daten auf der gesamten Festplatte:
# badblocks -sv -w /dev/sda
PS: Dies kann auch zum (fast) Sicheren löschen der Daten einer Festplatte verwendet werden.
Schreibtest ohne Zerstörung der Daten auf der gesamten Festplatte:
# badblocks -sv -n /dev/sda
Sind auf der Festplatte Fehler vorhanden und man möchte diese in die Liste der schlechten Blöcke des Filesystems eintragen, um z.B. noch ein paar Daten zu retten, so kann man dies mit „fsck“ tun.
# fsck.ext3 -c /dev/sda1
Festplatte via dd clonen/kopieren
!! Achtung, auch zerstören !!
So kann man seine Festplatte kopieren (das Ziel sdb wird ohne Rückfrage überschrieben!)
dd if=/dev/sda of=/dev/sdb
Will man sehen wie lange es noch dauert, muss man eine weitere Shell öffnen und folgendes eingeben:
while true; do sleep 5; kill -SIGUSR1 `pidof dd`; done;
danach wird in der Shell mit dem dd all 5 Sekunden der Datendurchsatz angezeigt.
Hier noch etwas besser
und mit „pv“ (pipe view) sieht man auch wie lange es noch dauert ohne das komplizierte SIGUSR1.
dd if=/dev/sda | pv | dd of=/dev/sdb
PS: Der pv Befehl hat noch einige Parameter, siehe „man pv“, mit „pv -s 512G“, z.b. die Größe der Festplatte
PPS: Bei neueren dd`s kann man den Status durch „status=progress“ anzeigen lassen.
PPPS: Ist die Festplatte bzw. das Speichermedium beschädigt kann mit „conv=noerror“ Lesefehler übergehen, die Fehlerhaften Bytes werden dann mit Nullen aufgefüllt.
Festplatten Image konvertieren für VMs
Ein mit dd erstelltes Festplattenimage lässt sich auch direkt via „qemu“ in ein Image für ein VM-Host convertieren. Hier ein Beispielbefehl:
qemu-img convert -O vmdk imagefile.dd vmdkname.vmdk
Festplatten Image mounten
Will man eine IMG Datei mal überprüfen oder Daten darin ändern bzw. lesen, kann man ein dd Festplatten image auch über ein local loopback device mounten.
Hier muss man jedoch den Offset in Bytes zur Partition angeben.
mount -o loop,ro,offset=1048576 backup.img /mnt/test
Offene Frage zum Thema: Wie bekommt man den offset heraus, den man hier eingeben muss?
Script starten beim Einstecken eines USB Gerätes
Das udev System sorgt dafür, das beim Einstecken von USB Geräten verschiedene Aktionen ausgeführt werden. Dieses Verhalten kann man für eigene Zwecke anpassen. Je nach Distribution sind schon mehr oder weniger Regeln vorhanden. Anzeigen kann man diese wie folgt:
# ls -l /etc/udev/rules.d/
...
-rw-r--r-- 1 root root 597 2. Jul 23:26 10-vboxdrv.rules
-rw-r--r-- 1 root root 6983 10. Jun 12:48 40-hplip.rules
-rw-r--r-- 1 root root 706 10. Jun 12:48 56-hpmud_support.rules
...
Durch die Ziffern (im Beispiel oben 10, 40 und 56) am Anfang der Dateinamen, werden die Regeln in dieser Reihenfolge abgearbeitet. Unser Beispiel soll 20-mystick.rules heißen:
# vi /etc/udev/rules.d/20-mystick.rules
Verschiede Beispiele für den Inhalt, wobei hier auch mehrere Zeilen aktiv sein dürfen, die jedoch verschiedene Filterkriterien beinhalten sollten (z.B. die Seriennummer):
# Stick mit S/N 180314019CBE4A02 wirft das CD-Laufwerk aus:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="180314019CBE4A02", RUN+="/usr/bin/logger Stick eingesteckt.", RUN+="/usr/sbin/eject /dev/cdrom"
# Stick nach Hersteller-Typ 1e3d bekommt den symbolischen Namen und ist dann unter /dev/myusbstick zu finden:
BUS=="usb", KERNEL=="sd?1", SYSFS{idVendor}=="1e3d", SYMLINK+="myusbstick", RUN+="/usr/bin/logger Stick myusbstick eingesteckt."
# Getrennte Aktionen für Ein- und Austecken:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="3513421B7E00D04C", ACTION=="add", NAME="sandisk4gb", RUN+="/usr/bin/logger 4GB SandiskStick eingeteckt."
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="3513421B7E00D04C", ACTION=="remove", RUN+="/usr/bin/logger 4GB SandiskStick entfernt."
# WD USB-Platte
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="57442D575841314141303534393439", ACTION=="add", NAME="wdblack", RUN+="/usr/bin/logger Disk wdblack drinne."
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="57442D575841314141303534393439", ACTION=="remove", RUN+="/usr/bin/logger Disk wdblack ist raus!"
Bei manchen Distributionen muss man nun udevd neu starten oder einen Reload machen, was bei Fedora 14 im Test nicht notwendig war. Möglicherweise muss man also z.B. so etwas machen:
# /etc/init.d/udevd reload
Ob die Aktion „/usr/bin/logger“ ausgeführt wird, kann man dann in der messages-Datei verfolgen:
# tail -f /var/log/messages # (Abbruch mit STRG-C)
Festplatte/Partition verschlüsseln
1. Paket installieren
apt-get install cryptsetup
2. Normale Partition anlegen
z.B. /dev/sdf1
3. Partition verschlüsseln
cryptsetup luksFormat /dev/sdf1
4. Partition aktivieren
cryptsetup luksOpen /dev/sdf1 crypt_extern
5. Filesystem erzeugen
mkfs.ext3 /dev/mapper/crypt_extern
6. Namen der Partition setzen
e2label /dev/mapper/crypt_extern MyName
Wenn die Festplatte an einem Server ohne Tastatur steht, muss man beim Starten aufpassen da sonst sofort nach dem Password gefragt wird. Hierzu habe ich das Start script „/etc/init.d/cryptdisks“ geändert, einfach den Parameter start) durch starta) erweitet, dann fahren die verschlüsselten Platten nicht hoch und mann kann das später via SSH machen.
PS: Das mit dem starta) geht nicht mehr bei Debian 8, hierzu muss in der Datei /etc/crypttab die Option auf 'noauto' gestellt werden. Den Eintrag für die 'Swap Patition' muss mit einer # auskommentiert werden und anschliessend muss noch ein 'update-initramfs -u' gemacht werden, damit der Kernel beim starten nicht versucht die Swap Partition zu aktivieren, was wieder zur Passworteingabe führt.
#!/bin/bash
#
# Festplattenverschlüsselung freigeben by MS 4.2014
#
echo "Festplattenverschlüsselung freigeben prüfen und mounten <PRESS ANYKEY>"
read
echo "Start crypt (Passwort notwendig)"
/etc/init.d/cryptdisks starta
cryptsetup luksOpen /dev/md1 md1_crypt
cryptsetup luksOpen /dev/md2 md2_crypt
echo "Start swap"
swapon /dev/mapper/md1_crypt
echo "Check Disk"
fsck /dev/mapper/md2_crypt
echo "Mount /media/disk"
mount /dev/mapper/md2_crypt /media/disk
echo "zur Info, Laufwerk freigegeben" | mail root -s "Info, Laufwerk freigegeben"
Linux Software RAID prüfen/retten/anlegen/erweitern
Hier ein paar kleine Hinweise zum Arbeiten mit einem Linux Software RAID.
1. Prüfen des RAID-Status im Kernel
Folgenden Befehl eingeben:
cat /proc/mdstat
Es erscheint der Zustand der RAID Devices md0..X. Bei einem Raid 5 könnte das zum Beispiel so aussehen:
Personalities : [linear][multipath][raid0][raid1][raid6][raid5][raid4][raid10]
md0 : active raid5 sdc1[1] sdb1[0] sdd1[2]
5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Fehlt in den []-Klammern ein U dann hat das RAID einen Fehler.
2. Prüfen des RAID-Status mit mdadm
Hierzu folgenden Befehl eingeben:
mdadm -D /dev/md0
Für das RAID Device md0 wird der Status angezeigt. (/dev/md0 = 1.RAID, /dev/md1 = 2. RAID usw.)
/dev/md0:
Version : 00.90
Creation Time : Thu Jul 15 22:48:11 2010
Raid Level : raid1
Array Size : 976069120 (930.85 GiB 999.49 GB)
Used Dev Size : 976069120 (930.85 GiB 999.49 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Jan 17 07:37:00 2017
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
UUID : 73d7f4a5:7c57b659:39813711:5b3df8d0 (local to host miniPC)
Events : 0.112060
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
3. Neue Platte gegen defekte tauschen
Ist die Platte neu muß zunächßt die neue Platte Partitioniert werden. Hierzu machen wir eine Kopie der Tabelle einer noch laufenden Platte.
Mit dem Befehl:
sfdisk -d /dev/sda | sfdisk /dev/sdb
sda = alte noch laufende Platte / sdb = neue leere Platte
Dann die Partition der neuen Platte dem RAID hinzufügen mit dem Befehl:
mdadm --manage -a /dev/md0 /dev/sdb1" für 1.RAID
mdadm --manage -a /dev/md1 /dev/sdb2" für 2.RAID
mdadm --manage -a /dev/md2 /dev/sdb3" für 3.RAID
Jetzt startet im Hintergrund der sync-Prozess den man mit dem Befehl „watch cat /proc/mdstat“ verfolgen kann.
Hinweis:
Sollte das hinzufügen der Patition mit -a nicht gehen muß diese womöglich zuvor mit dem Befehl:
mdadm --manage -r /dev/md0 /dev/sdb1
aus dem RAID entfernt werden.
Auch ein setzten des Fehler Bits ist möglich durch den Befehl:
mdadm --manage /dev/md1 --fail /dev/sdb2
Tipp:
Um die Zeit zur sync-Prozess zu verkürzen, können die Kernelparameter: „/proc/sys/dev/raid/speed_limit_min“ und „/proc/sys/dev/raid/speed_limit_max“ erhöht werden.
Hierzu z.B. den Befehl eingeben:
echo "10000" > /proc/sys/dev/raid/speed_limit_min
Tipp:
Ein neues RAID wird so angelegt:
mdadm --create /dev/md0 --level=1 --raid-devices=2 --spare-devices=0 /dev/sd[ac]1
Tipp:
Ein RAID erweitern:
mdadm --add /dev/md0 /dev/sdb1
mdadm --grow --raid-devices=3 /dev/md0
Tipp:
Wenn im mdstat die Meldung „inaktiv“ auftaucht, kann versucht werden einen Neustart auszulösen durch:
mdadm --run /dev/md0"
Tipp:
Wenn ein RAID auseinander gefallen ist kann dies möglicherweise wieder zusammen gebaut werden durch den Befehl:
mdadm --assemble --scan
Tipp:
Für die /etc/fstab braucht man die UUID zum Mounten, diese bekommt man mit dem Befehl:
mdadm --detail /dev/md4
Tipp:
Um eine Platte am Blinken/Vibrieren zu erkennen, kann man sie zum Lesen zwingen mit:
for i in $(seq 0 255); do \
dd of=/dev/null if=/dev/sda bs=1k count=255 skip=${i}M; \
done
Für einen zweiten Durchlauf die seq-Parameter erhöhen (Cache!).
VORSICHT, dd ist gefährlich. Genau aufpassen was man tut!
Bildschirme einstellen
Zum Einstellen mehrerer Monitore kann man das Programm 'lxrandr' unter LXDE verwenden. Andere Windowmanager haben ähnliche Tools, x.B. xrandr, wlr-randr, gnome-randr oder unter KDE kscreen-doctor
Bluetooth Hardware
Pairing auf Kommandozeile
Auf der Seite kofler.info [1] findet man Informationen, wie man mit bluetoothctl ein Gerät verbindet. Hier in Kürze, wie das abläuft.
Zuerst vorbereiten und nach Geräten scannen, die im Pairingmode sind. Auf dem gewünschten Gerät muss die Sichtbarkeit aktiviert werden: (Werte beispielhaft für CSL-12345)
$ bluetoothctl
[bluetooth]# agent on
[bluetooth]# pairable on
[bluetooth]# scan on
Discovery started
...
[NEW] Device 12:34:AB:56:CD:78 xxyyzzabcd
[CHG] Device 12:34:AB:56:CD:78 Name: CSL-12345
...
[bluetooth]# scan off
Discovery stopped
Jetzt verbinden wir uns mit dem Gerät CSL-12345:
[bluetooth]# pair 12:34:AB:56:CD:78
Attempting to pair with 12:34:AB:56:CD:78
[CHG] Device 12:34:AB:56:CD:78 Connected: yes
[agent] PIN code: 543210
--> Pin-Eingabe + Return auf der Tastatur <--
[CHG] Device 12:34:AB:56:CD:78 Paired: yes
Pairing successful
[bluetooth]# trust 12:34:AB:56:CD:78
Changing 12:34:AB:56:CD:78 trust succeeded
[CHG] Device 12:34:AB:56:CD:78 Connected: yes
[bluetooth]# connect 12:34:AB:56:CD:78
Attempting to connect to 12:34:AB:56:CD:78
Connection successful
[1] https://kofler.info/bluetooth-konfiguration-im-terminal-mit-bluetoothctl/
File via Console nach Bluetooth spielen
Ist ein Gerät, wie ein Bluetooth-Lautsprecher schon einmal gepairt, muss man ihn gegebenfalls vor dem Abspielen einmal connecten:
echo -e connect 70:99:1C:33:65:7C | bluetoothctl
Mit pactl bekommen wir die laufende Nummer unseres verbundenen Lautsprechers:
pactl list sinks short
2 alsa_output.pci-0000_00_1f.3.analog-stereo module-alsa-card.c s16le 2ch 48000Hz SUSPENDED
8 bluez_sink.70_99_1C_33_65_7C module-bluez5-device.c s16le 1ch 8000Hz SUSPENDED
mplayer -ao pulse::8 Musi.mp3
Die 8 ist hier eine laufende Nummer die bei jedem reconnect erhöht wird.
Um jetzt eine Audiodatei abspielen zu können, ermitteln wir mit pactl, grep und awk die jeweils neue Nummer und übergeben diese an mplayer:
mplayer -ao pulse::`pactl list sinks short | grep 70_99_1C_33_65_7C | awk {'print $1'}` Musi.mp3
Die Anweisungen in den Backticks ergeben in unserem Beispiel die Ziffer 8. Durch die Verkettung von pactl, grep und awk erhalten wir hier immer die gerade aktuell gültige Nummer. Die MAC-Adresse muss man natürlich auf seine Anforderungen anpassen.