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.