Raspberry Pi: Festplatte / USB-Stick einbinden Teil 2

In Teil 1 haben wir die allgemeine Prozedur für ein beliebiges unbekanntes USB-Device erläutert. Hier geht es nun um bekannte USB-Geräte.

Wer möchte schon jedesmal die gleichen Parameter suchen und Befehle ausführen um auf seine eigene USB-Platte oder USB-Stick zuzugreifen? Also wird man dem System die eigenen Geräte bekanntgeben und dann gibt es nur zwei Varianten, entweder die USB-Geräte sind beim Systemstart verbunden und werden, weil bekannt, auch erkannt, oder man verbindet die USB-Geräte im laufenden Betrieb und setzt dann ein mount (binde Gerät ein) ab.
Hier die Beschreibung:

Wenn ich stets meine bekannten Geräte benutze, so muß ich sie auch dem System bekanntgeben.
a) UUID ermitteln
Jedes Gerät hat seine UUID.
Die bekomme ich wie folgt:
– USB-Gerät einstecken
– Kommando blkid absetzen


pi@raspbox ~ $ sudo blkid
/dev/mmcblk0p1: SEC_TYPE="msdos" UUID="C522-EA52" TYPE="vfat"
/dev/mmcblk0p2: UUID="62ba9ec9-47d9-4421-aaee-71dd6c0f3707" TYPE="ext4"
/dev/sda1: LABEL="IOMEGA_HDD" UUID="F8682F59682F1642" TYPE="ntfs"
/dev/sda2: LABEL="USB DISK" UUID="F0E5-0793" TYPE="vfat"

Die UUID für den USB-Stick ist F0E5-0793 und der Dateisystemtyp vfat (FAT), die UUID für die USB-Platte ist F8682F59682F1642 und der Dateisystemtyp ntfs.

b) in /etc/fstab eintragen
Nun können wir die USB-Platte und den USB-Stick in die fstab eintragen.
sudo nano /etc/fstab


proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
UUID=F0E5-0793 /media/usb1 vfat defaults,dmask=0000,fmask=0000 0 0
UUID=F8682F59682F1642 /media/usb2 ntfs-3g defaults,dmask=0000,fmask=0000 0 0

c) Gerät mounten (einbinden)
Wenn wir die USB-Platte im laufenden Betrieb verbinden, müssen wir sie mounten (einbinden):

sudo mount -a

pi@raspbox /media $ sudo mount -a
mount: special device UUID=F0E5-0793 does not exist

Die Fehlermeldung stimmt! Der USB-Stick ist steckt nicht im Gerät. Dafür ist die Platte gemountet, was ein Blick in das Verzeichnis /media/usb2 zeigt.

Wer nicht im laufenden Betrieb Geräte einbinden möchte, muß sie bereits beim Systemstart im Gerät haben. Da wird die /etc/fstab standardmäßig abgearbeitet.

d) Gerät umounten (abhängen, trennen)
Soll die USB-Platte im laufenden Betrieb vom System getrennt werden, bitte unbedingt vorher ein sudo umount /media/usb2 absetzen und dann erst trennen!
Alternativ: System herunterfahren.

Dieser Artikel ist die Fortsetzung von Teil 1

PowerShell – Aufruf der PowerShell mit Parametern

Eine Auflistung der möglichen Aufrufparameter der Powershell

-Command Hier kann man einfach eine Zeile mit Kommandos übergeben, die direkt ausgeführt werden und die PowerShell wird wieder beendet.
Beispiel: Ausgabe eines Verzeichnisinhaltes

C:\Users>powershell -command Get-ChildItem -Path C:\Temp\Bsp

    Verzeichnis: C:\Temp\Bsp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        14.08.2013     21:48          8 File_1.txt
-a---        14.08.2013     21:48         14 File_2.txt

C:\Users>

-EncodedCommand Akzeptiert eine base-64-codierte Zeichenfolgenversion eines Befehls.
Verwende diesen Parameter, um Befehle an Windows PowerShell zu senden,
für die komplexe Anführungszeichen/geschwungene Klammern erforderlich sind.

-ExecutionPolicy Setzt die ExecutionPolicy für die aktuelle Sitzung.
Definierte Werte sind z.B. Restricted, Unrestricted.
Im Beispiel ist der gesetzte Wert „Unrestricted“ unter Process zu finden. Die lokale ExecutionPolicy auf Maschinenebene ist hier jedoch „Restricted“.

C:\Users>powershell -ExecutionPolicy Unrestricted -Command Get-ExecutionPolicy -List

                                  Scope                         ExecutionPolicy
                                  -----                         ---------------
                          MachinePolicy                               Undefined
                             UserPolicy                               Undefined
                                Process                            Unrestricted
                            CurrentUser                               Undefined
                           LocalMachine                              Restricted

C:\Users>

-File Dient zur Übergabe einer Skriptdatei.

C:\Users>powershell -NoProfile -NoLogo -File C:\Scripts\TestScript.ps1

-InputFormat Beschreibt das Format der die PowerShell übergebenen Daten. Gültige
Werte sind „Text“ (Textzeichenfolgen) und „XML“ (serialisiertes CLIXML-Format).
Standardwert ist „Text“.

-NoExit PowerShell wird nach Startup Kommandos nicht beendet. Nützlich, wenn man PowerShell via Kommandozeile startet und danach in der Shell weiterarbeiten möchte.

-NoLogo Die PowerShell wird ohne Anzeige des sonst üblichen Copyright Banners gestartet.

-Noninteractive Die PowerShell wird im nicht-interaktiven Modus gestartet, d.h. sie interagiert nicht mit dem Benutzer … keine Eingabeaufforderung!

-NoProfile Es soll kein userspezifisches Profil, auch wenn vorhanden, geladen werden!

-OutputFormat Legt die Formatierung der PowerShell-Ausgabe fest visit this site. Gültige Werte sind
„Text“ (Textzeichenfolgen) und „XML“ (serialisiertes CLIXML-Format).
Standardwert ist „Text“.

-PSConsoleFile Lädt eine PowerShell-Konsolendatei. Verwende
„Export-Console“ in Windows PowerShell, um eine Konsolendatei zu erstellen.
Eine Konsoldatei hat die Extension .psc1 .

-Sta Startet die PowerShell im single-threaded Mode.

-Version Startet die PowerShell in der angegebene Version, um die Kompatibilität sicherzustellen (z.Zt. 1, 2, 3). Ist die angegeben Version nicht installiert, erfolgt eine Fehlermeldung:

C:\Users>powershell -Version 3
Die Windows PowerShell-Version 3 kann nicht gestartet werden, da sie nicht 
ordnungsgemäß installiert ist.

 

-WindowStyle Legt den Fensterstil auf „Normal“, „Minimized“, „Maximized“, „Hidden“ fest. Standardwert ist „Normal“.

Beispiel: PowerShell Kommando „versteckt“ (hidden) ablaufen lassen.

start /min powershell -WindowStyle Hidden -Command <command>

Perl – führende und nachfolgende Leerzeichen aus einem String entfernen – trim()

Oft sind Eingaben von Anwendern mit führenden oder nachfolgenden Leerzeichen versehen.
Dies ist fast immer unnötig und kann bei Suche und Abgleich zu Problemen führen.
Wenn nicht schon bei der Verarbeitung der Eingabe, so spätestens bei der Suche und beim Abgleich von Daten empfiehlt sich das Abschneiden der Leerzeichen – das Trimmen.

Dazu definiert man folgende Subroutine:

# ################################################
# TRIM A STRING
# ################################################
sub trim() {
  my $str = $_[0];
  $str =~ s/^\s+|\s+$//g;
  return $str;
};

Der Aufruf der Subroutine und damit das Trimmen wie in diesem Beispiel:

my $name="  Klaus Mueller  ";
print ":".$name.":\n";
$name=&trim($name);
print ":".$name.":\n";

Ausgabe:

:  Klaus Mueller  :
:Klaus Mueller:

Linux: RAM Riegel auslesen / Max. RAM ermitteln

Oft steht man vor dem Problem, das ein RAM Riegel defekt ist oder man einfach nur den vorhandenen Speicher beim Server, PC oder Laptop erweitern möchte.
Nur wie findet man heraus, wieviele RAM Slots verfügbar sind bzw. wie diese belegt sind?

Unter Linux geht dies ganz einfach wie folgt:

dmidecode –type memory

Die Ausgabe sollte dann in etwa so aussehen (Daten sind von meinem recht alten Laptop):

SMBIOS 2.4 present.

Handle 0x0007, DMI type 5, 20 bytes
Memory Controller Information
Error Detecting Method: None
Error Correcting Capabilities:
None
Supported Interleave: One-way Interleave
Current Interleave: One-way Interleave
Maximum Memory Module Size: 2048 MB
Maximum Total Memory Size: 4096 MB
Supported Speeds:
Other
Supported Memory Types:
DIMM
SDRAM
Memory Module Voltage: 2.9 V
Associated Memory Slots: 2
0x0008
0x0009
Enabled Error Correcting Capabilities:
Unknown

Handle 0x0008, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM Slot 1
Bank Connections: 0 3
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 512 MB (Double-bank Connection)
Enabled Size: 512 MB (Double-bank Connection)
Error Status: OK

Handle 0x0009, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM Slot 2
Bank Connections: 4 7
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 512 MB (Double-bank Connection)
Enabled Size: 512 MB (Double-bank Connection)
Error Status: OK

Handle 0x0029, DMI type 16, 15 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 2 GB
Error Information Handle: Not Provided
Number Of Devices: 2

Handle 0x002A, DMI type 17, 27 bytes
Memory Device
Array Handle: 0x0029
Error Information Handle: No Error
Total Width: 64 bits
Data Width: 64 bits
Size: 512 MB
Form Factor: SODIMM
Set: None
Locator: DIMM 1
Bank Locator: Bank 0/1
Type: DDR2
Type Detail: Synchronous
Speed: Unknown
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified

Handle 0x002B, DMI type 17, 27 bytes
Memory Device
Array Handle: 0x0029
Error Information Handle: No Error
Total Width: 64 bits
Data Width: 64 bits
Size: 512 MB
Form Factor: SODIMM
Set: None
Locator: DIMM 2
Bank Locator: Bank 2/3
Type: DDR2
Type Detail: Synchronous
Speed: Unknown
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified

 

 

Raspberry Pi: Festplatte / USB-Stick einbinden Teil 1

a) Bevor man den Stick anschließt, hängt man sich an das Systemlog mit
tail –f /var/log/messages
Wenn man das Gerät (Plate oder Stick) anschließt, werden entsprechende Log-Einträge erzeugt. Hier im Beispiel, das Einstecken eines USB-Stick erzeugt folgende Einträge in /var/log/messages:


Jun 11 21:36:10 raspbox kernel: [ 396.314129] usb 1-1.3: new high-speed USB device number 5 using dwc_otg 
Jun 11 21:36:10 raspbox kernel: [ 396.506619] usb 1-1.3: New USB device found, idVendor=090c, idProduct=1000 
Jun 11 21:36:10 raspbox kernel: [ 396.506650] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 
Jun 11 21:36:10 raspbox kernel: [ 396.506666] usb 1-1.3: Product: Flash Disk 
Jun 11 21:36:10 raspbox kernel: [ 396.506679] usb 1-1.3: Manufacturer: USB 
Jun 11 21:36:10 raspbox kernel: [ 396.506692] usb 1-1.3: SerialNumber: FBH1111180113205 
Jun 11 21:36:10 raspbox kernel: [ 396.518536] scsi1 : usb-storage 1-1.3:1.0 
Jun 11 21:36:12 raspbox kernel: [ 397.774223] scsi 1:0:0:0: Direct-Access USB Flash Disk 1100 PQ: 0 ANSI: 4 
Jun 11 21:36:12 raspbox kernel: [ 397.777883] sd 1:0:0:0: [sda] 7831552 512-byte logical blocks: (4.00 GB/3.73 GiB) 
Jun 11 21:36:12 raspbox kernel: [ 397.778633] sd 1:0:0:0: [sda] Write Protect is off 
Jun 11 21:36:12 raspbox kernel: [ 397.790746] sda: sda1 
Jun 11 21:36:12 raspbox kernel: [ 397.796050] sd 1:0:0:0: [sda] Attached SCSI removable disk

Man erkennt hier im Beispiel sda: sda1, mit anderen Geräten an anderem Port z.B. sdb: sdb1 …diese Angabe benötigen wir später für das Mounten des neuen Gerätes ( unter c) ).
Mit Strg-C löst man das Terminal von der Log-Datei.

b) Als nächster Schritt steht das Einrichten des Mountpoints an. Das ist das Verzeichnis, in dem die angeschlossenen Daten in die bestehende Verzeichnisstruktur eingebunden werden sollen.
Meist wird dafür unter /media ein Mountpoint eingerichtet.
Als Verzeichnisnamen kann man einen passenden Namen z.B. usbdisk wählen

sudo mkdir /media/usbdisk

c) Danach kann das Gerät eingebunden (gemountet) werden, mit folgendem Kommando

sudo mount -t vfat -o uid=pi,gid=pi /dev/sda1 /media/usbdisk/

Dieses Mount-Kommando bindet die auf dem USB-Gerät vorhandene Dateistruktur unterhalb des Mountpoints (hier im Beispiel /media/usbdisk ) ein. Eingebunden ist das Gerät aber nur bis zum nächsten Systemneustart bzw. bis zum „Auswerfen“.

Zunächst testen wir den Zugriff auf unsere gemounteten Daten mit

cd /media/usbdisk (Wechsel in die gemountete Dateistruktur)

ls –las (Anzeige der Dateien)

d) Um das USB-Gerät “auszuwerfen “ / zu trennen, setzt man folgendes Kommando ab:

sudo umount /media/usbdisk

Es ist eigentlich ganz selbstverständlich: USB-Geräte nie bei laufendem System einfach herausziehen! Das führt meist zu Schäden am Dateisystem, besonders wenn gerade Dateien im Zugriff sind.
Dieses Vorgehen ist nur für die temporäre Benutzung, also wenn man mal kurzzeitig für einen Datentransfer eine fremde Platte oder einen unbekannten Stick anschließen möchte, geeignet.
Wer stets „seine“ bekannten Geräte benutzt, für den gibt es in Teil 2 ein komfortableres Verfahren.

RaspberryPi_WLAN3
Abb.: Raspberry Pi Model B mit WLAN-Stick in einem Plexiglas-Gehäuse

NAS für Heimanwender

NAS zu Hause bedeutet ja letzendlich nichts anderes als Festplattenkapazitäten in seinem Heimnetzwerk zur Verfügung zu stellen und von seinem PC oder Notebook darauf zuzugreifen und diese Kapazitäten als Netzwerklaufwerk in seinem Betriebssystem zu nutzen (z.B. mit dem CIFS Protokoll). Anmerkung: Die Definition für NAS findest du unter Storage Management.

Zunächst sollten einige Vorüberlegungen angestellt werden, die als Grundlage der später eingesetzten Lösung dienen sollen.

1. Wofür möchte ich das NAS nutzen – als Datenablage oder für Datensicherung ?

Wenn ich das NAS als Datensicherung für bereits vorhandene Kapazitäten nutzen möchte, dann ist es meiner Meinung nach nicht notwendig sich für eine Lösung zu entscheiden, die eine RAID Absicherung bietet. Als Datensicherungsziel reicht demnach eine einzelne, nicht abgesicherte, Festplatte aus. Sollte diese defekt sein, dann habe ich ja nur meine Datensicherung verloren. Diese kann ich auf einem neuen Medien wieder neu erstellen.

2. Müssen die Daten gesichert werden oder kann ich einen ggf. Verlust verschmerzen ?

Wenn ich das NAS als Datenablage nutze, muß ich mich entscheiden, ob ich die Daten sichern möchte oder nicht. Hier gebe ich zu bedenken, daß eine ggf. vorhandene RAID Absicherung der Festplatten keine Datensicherung ersetzt. RAID hilft letztendlich nur bei einer Hardwarestörung einer Festplatte, nicht jedoch gegen logische Fehler (z.B. duch Viren verursacht).

3. Kann ich z.B. bei einem Festplattendefekt eine gewisse Zeit auf meine Daten verzichten oder muß ich permanent darauf zugreifen können ?

Für Heimanwender ist es i.d.R. kein Problem, wenn mal eine Zeit lang nicht auf die Daten zugegriffen werden kann, das muß aber jeder für sich selbst entscheiden. Wer bei einem Festplattendefekt weiterhin an seine Daten kommen möchte, ist gut beraten seine Festplatte in einem RAID Verbund abzusichern.

Ich persönlich nutze 2 NAS Festplatten zu Hause. Beide für sich sind nicht über RAID abgesichert und Standalone. Platte 1 dient als Ablage für diverse Daten wie Fotos, Dokumente etc. und auf Platte 2 mache ich in regelmäßigen Abständen die Datensicherug von Platte 1. Sollte Platte 1 einen Defekt haben, dann sind die Daten noch auf Platte 2 vorhanden und zugreifbar.

Stor_SANKarte

automatisiertes ssh-Login und Aktion mit expect

Ein ssh-Login zu automatisieren, ist stabil nur durch expect, via Skript, zu realisieren.
Expect ist ein spezialisiertes Tool zur Automatisierung interaktiver Anwendungen auf Unix.
Unter Windows soll es auch einen Clone geben (sourceforge.net ).

Das ssh-Login interaktiv aufgerufen ssh sshusr@server03 fordert zur Eingabe des Passwortes auf.
Mit Hilfe von expect wird nach Absenden (spawn) des Befehls auf den String „password“ gewartet.
Dazu das Skript ssh_loginaction mit folgendem Aufruf und Parametern:

./ssh_loginaction user password server03

#!/usr/local/bin/expect
set timeout 30
set user [lindex $argv 0]
set pass [lindex $argv 1]
set host [lindex $argv 2]
spawn ssh $user@$host
expect {
    "password:" {send "$pass\r"}
  default {puts stdout "\nHat nicht funktioniert!" exit}
}

expect "prompt>" {send "action_command\r"}
expect "prompt>" {send "exit\r"}
puts stdout "\nEND\n"

set timeout 30 – Standard sind 10 Sekunden Timeout. Dann beendet sich expect ohne weitere Warnung. Es soll ja Server geben, die unter Last und nur über ausgiebiges Routing zu erreichen, etwas länger für das Login brauchen. Ich hatte mich gewundert, als ein expect die Aktion meist ausführte, manchmal aber eben nicht. Grund war ein nicht definierter Timeout und dann ist nach 10 Sekunden Schluss.

Perl – FOR Schleife im besonderen Einsatz

Üblicherweise wird eine FOR Schleife in folgender Syntax verwendet
for ($n=0;$n<=5;$i++) { print „$n \n“; }
oder auch mit Laufvariable $_
for (0..5) { print „$_ \n“; }

Im besonderen Fall gibt es eine Liste von Aufträgen, die nicht alle gleichzeitig, sondern nur in bestimmten Abschnitten abgearbeitet werden sollen.

Hier werden aus einem Array von Aufträgen nur die Elemente 4 bis 7 verarbeitet.
for (3..6) {
$auftrag = (10,20,30,40,50,60,70,80,90,100)[$_];
print „Auftrag: „.$auftrag.“\n“;
};

Auftrag 40
Auftrag 50
Auftrag 60
Auftrag 70
 

Projektdiskussion – Private Home NAS

Hier werden wir darüber sprechen, wie ein NAS (Network Attached Storage) im privaten Bereich günstig aufgebaut und zuverlässig betrieben werden kann.

Dabei sollen folgende Anforderungen erfüllt werden.
– Zentrale Datenhaltung und Datensicherung
– Streaming von Medien ( Musik, Filme, Video ) – DLNA

Berücksichtigung von folgenden Parametern:
– Stromverbrauch, weil eigentlich immer online
– Datensicherheit (periodische Syncronisation oder Raid 1, Raid 5)
– Preis ( Beschaffung und Betrieb )
– Standardschnittstellen und Bauteile
– einfache Verwaltung über Weboberfläche

Für private NAS gibt es vorgefertigte Lösungen, oder man bringt eine eigene Architektur an den Start.

Meine erste Idee war tatsächlich, ein „fertiges“ NAS zu kaufen. Zwei Platten Raid 1 gespiegelt, … doch der Preis von 300€ ohne Platten hat mich davon abgehalten.

Welche Lösungen habt Ihr so am Start?
Was sind Eure Überlegungen oder Erfahrungen?
Feel free to post it!

Christian Hover schreibt „NAS für Heimanwender“ – einen Beitrag zu folgenden Fragen:
1. Wofür möchte ich das NAS nutzen – als Datenablage oder für Datensicherung ?
2. Müssen die Daten gesichert werden oder kann ich einen ggf. Verlust verschmerzen ?
3. Kann ich z.B. bei einem Festplattendefekt eine gewisse Zeit auf meine Daten verzichten oder muß ich permanent darauf zugreifen können ?