Pogoplug – USB Stick vergrößern und Dateisystem auf ext4 ändern


Wie man auf einem USB Stick ArchLinux für den Pogoplug installiert, ist ja bekannt. Auch wie man den USB Stick „kopiert“ bzw. vergrößert. Alles ein alter Hut.
Aber von Haus aus ist das Dateisystem auf dem Stick ext2. Es wird also kein Journaling unterstützt. Damit kann man leben, muss man aber nicht. Hat man keine wichtigen Daten auf dem Stick oder sowieso ein Backup der Daten, so kann man natürlich auf Journaling verzichten, ist ja nicht zwingend nötig. Will man sich allerdings etwaige Probleme bei Stromausfällen usw. ersparen schadet Journaling sicherlich nicht.
Wenn man nun eh einen anderen Stick nutzen möchte kann man nun den neuen Stick komplett „umbauen“ und den Anforderungen an ein aktuelleres journaled Dateisystem anpassen.



1. Partitionieren des Sticks

Der Bootloader uBoot kann den Kernel (uImage) nur von /dev/sda1 mit einem ext2 Dateisystem laden. Da kann man wenig machen und muss mindestens /boot auf /dev/sda1 als ext2 belassen. Der Rest des Sticks kann dann als eine oder mehrere weitere Partition(en) (mit ext4) partitioniert werden.
Die Partition /dev/sda1 f. /boot muss nicht groß sein. Es reichen hier ein paar Megabyte vollkommen aus. Da es mir nicht auf jedes MB ankommt mache ich die erste Partition einfach mal 20MB groß. Die zweite Partition f. das Rootverzeichnis / wird 4GB, der Rest wird für /home genommen.

Ich gehe wie folgt vor: Der Stick wird in einem vorhandenen Linux partitioniert, formatiert und die Daten entsprechend auf den Stick kopiert. Die nachfolgenden Vorgehensweisen müssen u.U. auf eigene Bedürfnisse angepasst werden. Wie immer gilt: Keine Gewähr, alles geschieht auf eigenes Risiko. (Mit)Denken erspart manchmal Probleme 😉

Damit man nun den richtigen Stick partitioniert und nicht versehentlich seine Platte vernichtet: Einstecken und in dmesg sehen, welches Device der Stick erhält. Ich nehme in den weiteren Beispielen /dev/sdx an.

[ 467.615039] sd 6:0:0:0: [sdx] 31266816 512-byte logical blocks: (16.0 GB/14.9 GiB)
[ 467.623898] sd 6:0:0:0: [sdx] Write Protect is off
[ 467.623907] sd 6:0:0:0: [sdx] Mode Sense: 43 00 00 00
[ 467.624774] sd 6:0:0:0: [sdx] Write cache: disabled, read cache: enabled, doesn’t support DPO or FUA

Nun kann man mit fdisk die Partition auf dem Stick anlegen. Wichtig: Der sollte nicht gemountet sein.

Shell #> sudo fdisk /dev/sdx
p zeigt die vorhandenen Partitionen an
d (löscht vorhandene Partition(en) auf dem Stick
n legt eine neue Partition an
p Typ wird primär
1 Partitionsnummer
Startzylinder so belassen,
+20M als Größe für die erste Partition angeben.
a setzt das Boot-Flag
1 Partition 1 wird als bootbar gekennzeichnet
n
p
2
Startzylinder wieder so belassen
+4G erstellt eine 4GB Partition

usw. usf. für weitere gewünschte Partitionen.
w Zum Abschluss wird die neue Partitionstabelle geschrieben und diese neu eingelesen.

Der Stick hat nun die gewünschten Partitionen. Nun können die Partitionen entsprechend formatiert werden.


2. Formatieren mit ext2 und ext4.

Die Partitionen stehen nun als /dev/sdx1, /dev/sdx2 und so weiter zur Verfügung.
Wir formatieren die erste Partition mit dem ext2 Dateisystem, alle anderen mit ext4 und ändern hier den reservierten Bereich von Standard-5% auf 1% ab:

Shell Linux#> sudo mkfs.ext2 /dev/sdx1
Shell Linux#> sudo mkfs.ext4 -m 1 /dev/sdx2
Shell Linux#> sudo mkfs.ext4 -m 1 /dev/sdx3


3. Verzeichnisse anlegen und Daten kopieren

Der einfachste Weg ist, erstmal alle Daten auf die zweite Partition /dev/sdx2 zu kopieren und danach nur das Verzeichnis boot nach /dev/sdx1 zu verschieben. Man kann dieses entweder mit dem entpacken des kompletten Verzeichnisses nach /dev/sdx2 erreichen oder man kopiert die Daten von einem anderen Stick rüber. Ich spare mir hier weitere Ausführungen, cp -a kriegt man auch selber hin 😉


4. Änderung /etc/fstab

Die fstab auf dem Stick kann nun angepasst werden. Wir finden diese unter /dev/sdx2/etc/fstab. Eine fstab kann somit wie folgt aussehen:

pogoplug_fstab

Es werden in der fstab nun die neuen Partitionen mit dem Dateisystem ext4 aufgeführt, ebenso die erste mit ext2. Man kann diese nun nach Wunsch anpassen.


5. Änderung des uBoot Loaders

Wenn man nun alle Daten auf /dev/sdx2, das Verzeichnis boot nach /dev/sdx1 kopiert hat muss man nur noch den uBoot Bootloader abändern. Im Normalfall bootet dieser von der ersten Partition eines Sticks. Wir ändern dieses auf die zweite Partition ab. Dieses geschieht allerdings nicht mit dem Linux, welches wir zum Partitionieren und Formatieren genutzt haben. Diese Änderungen muss man auf dem Pogoplug selber vornehmen und braucht hierfür Zugriff per SSH. Hat man schon einen laufenden USB Stick erstellt kann man einfach per SSH auf den Pogoplug zugreifen und als root (oder mit sudo) folgende Änderungen vornehmen:

Shell pogoplug#> fw_setenv usb_scan_1 ‚usb=0:1 dev=sda2‘
Shell pogoplug#> fw_setenv usb_scan_2 ‚usb=1:1 dev=sdb2‘
Shell pogoplug#> fw_setenv usb_scan_3 ‚usb=2:1 dev=sdc2‘
Shell pogoplug#> fw_setenv usb_scan_4 ‚usb=3:1 dev=sdd2‘

Nun muss dem Bootloader uBoot noch mitgeteilt werden, dass das Rootdateisystem / nicht mehr /dev/sda1 mit ext2 sondern /dev/sda2 mit ext4 ist:

Shell pogoplug#> fw_setenv usb_root /dev/sda2
Shell pogoplug#> fw_setenv usb_rootfstype ext4

Die komplette Liste aller Werte erhält man mit

Shell pogoplug#> fw_printenv

aufgeführt. Da gibt es noch weitere Werte, die man anpassen oder hinzu fügen kann.


6. Netconsole einrichten

Der uBoot Loader bietet eine Unterstützung der Netconsole (netcat, nc). Damit sieht man zumindest auf einem remote Rechner ein paar Meldungen des Bootloaders und kann u.U. etwas eingreifen.
Sollte man sich auf jeden Fall einrichten, sofern noch nicht geschehen. Und idealerweise auch sicherstellen, dass netcat funktioniert und die Anzeige korrekt erscheint.

Netconsole vom Pogoplug schickt die Meldungen des uBoot Loaders (ähnlich dem BIOS) über Netzwerk an einen anderen Rechner. Hier muss ebenfalls netcat laufen und die Daten empfangen und anzeigen.

Auf dem Pogoplug (hier: 192.168.1.20) wird die IP des anzeigenden Rechners als „Server“ (hier: 192.168.1.10) vorgenommen:

Shell pogoplug#> fw_setenv serverip 192.168.1.10
Shell pogoplug#> fw_setenv ipaddr 192.168.1.20
Shell pogoplug#> fw_setenv if_netconsole ‚ping $serverip‘
Shell pogoplug#> fw_setenv start_netconsole ’setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;‘
Shell pogoplug#> fw_setenv preboot ‚run if_netconsole start_netconsole‘

Der Zielrechner kann nun die Ausgabe vom Pogoplug „empfangen“ und anzeigen. Hierzu muss ebenfalls Netcat gestartet werden.

Shell Linux#> nc -l -u -p 6666

(Hinweis: Unter Ubuntu ist die Version von netcat-openbsd installiert. Diese unterscheidet sich etwas in den Optionen. Einfach netcat-traditional nachinstallieren und über nc.traditional aufrufen.)


7. Reboot

Ist man nun soweit durch kann man rebooten. Läuft alles gut, so werden einem die Bootmeldungen vom Bootloader angezeigt, dieses braucht etwas bis dort steht „Booting Kernel“. Danach sollte der Pogoplug auch schon wieder im LAN erreichbar sein. Voilà.


8. Was alles schief gehen kann…

a.) Wenn man den Kernel falsch abgelegt hat:
Man hat zwar /dev/sda1 als ext2 angelegt und die Datei uImage dort hinkopiert, aber leider nicht in das benötigte Verzeichnis boot:

Loading file "/boot/uImage" from usb device 0:1 (usbda1)
** File not found /boot/uImage
** Block device usb 1 not supported
** Block device usb 2 not supported
** Block device usb 3 not supported
Loading file "/boot/uImage" from usb device 0:1 (usbda1)
** File not found /boot/uImage
Loading file "/boot/uInitrd" from usb device 0:1 (usbda1)
** File not found /boot/uInitrd
Wrong Image Format for bootm command
ERROR: can't get kernel image!
stopping USB..
### JFFS2 loading 'uboot-original-mtd0.kwb' to 0x800000
Scanning JFFS2 FS: ........ read_nand_cached: error reading nand off 0x22f0a00 size 8192 bytes
done.
read_nand_cached: error reading nand off 0x22f1a00 size 8192 bytes
off = 0x22f1254 magic 0x1985 type 0xe002 node.totlen = 2919
### JFFS2 load complete: 524288 bytes loaded to 0x800000
## Starting application at 0x00800200 ...

Der Pogoplug startet nun sein recovery System und bootet normal in das Pogoplug System.
Lösung:
Entweder den Stick in einen anderen Rechner stecken, auf /dev/sdx1 das Verzeichnis boot anlegen und die Datei uImage hier hineinkopieren. Danach bootet der Stick wieder in sein auf dem Stick installiertes Linux.


Links
http://archlinuxarm.org/forum/viewtopic.php?f=23&t=3552
http://stackoverflow.com/questions/10065993/how-to-switch-to-netcat-traditional-in-ubuntu


Dieser Beitrag wurde unter Dokus und Tipps, Pogoplug, Technikspielkram abgelegt und mit , , , , , , , , , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert