{"id":425,"date":"2018-10-04T21:43:52","date_gmt":"2018-10-04T19:43:52","guid":{"rendered":"http:\/\/blog.roellig-it.de\/?p=425"},"modified":"2018-10-05T15:36:35","modified_gmt":"2018-10-05T13:36:35","slug":"raspberry-pi-mit-spiegel-sticks","status":"publish","type":"post","link":"https:\/\/blog.roellig-it.de\/index.php\/2018\/10\/04\/raspberry-pi-mit-spiegel-sticks\/","title":{"rendered":"Raspberry Pi mit Spiegel-Sticks"},"content":{"rendered":"<div class=\"panel-body\">\n<p>Quelle: https:\/\/labs.consol.de\/raspberrypi\/2012\/08\/30\/raspberry-pi-mit-spiegel-sticks.html<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>In diesem Post wird gezeigt, wie man einen Raspberry Pi Miniatur-Computer mit einem Root-Filesystem ausstattet, das auf zwei gespiegelten USB-Sticks liegt.<\/p>\n<p>Der Raspberry Pi (Modell B) wird mit einem SD-Karten-Leser und zwei USB-Ports geliefert. Das Betriebssystem Raspbian, eine Variante von Debian, wird als Image heruntergeladen und auf eine SD-Karte kopiert. Diese enth\u00e4lt danach zwei Partitionen, eine f\u00fcr das \/boot- und eine f\u00fcr das \/-Filesystem. Nach dem Booten zeigt sich folgendes Bild:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# df\r\nFilesystem     1K-blocks    Used Available Use% Mounted on\r\nrootfs          15118600 4141560  10209048  29% \/\r\n\/dev\/root       15118600 4141560  10209048  29% \/\r\ntmpfs              23656     312     23344   2% \/run\r\ntmpfs               5120       0      5120   0% \/run\/lock\r\ntmpfs              47312       0     47312   0% \/tmp\r\ntmpfs              10240       0     10240   0% \/dev\r\ntmpfs              47312       0     47312   0% \/run\/shm\r\n\/dev\/mmcblk0p1     57288   41192     16096  72% \/boot\r\nroot@raspberrypi:~# ls -l \/dev\/root\r\nlrwxrwxrwx 1 root root 3 Aug 30 21:17 \/dev\/root -&gt; mmcblk0p2<\/code><\/pre>\n<\/div>\n<p>Das \/boot-Filesystem mit dem Kernel <i>kernel.img<\/i> kann nirgendwo anders liegen als in der ersten Partition der SD-Karte. Das \/-Filesystem hingegen kann sich auf einem beliebigen Datentr\u00e4ger befinden. In einem ersten Schritt zeige ich, wie man es auf einen USB-Stick legt.<\/p>\n<h3>Stick einstecken und Device-Namen ermitteln<\/h3>\n<p>Beim Einstecken der Sticks wird man in \/var\/log\/messages sehen, dass es ein neues Device \/dev\/sda gibt.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">Aug 29 17:17:14 raspberrypi kernel: [    7.784278] usb 1-1.3.7: New USB device found, idVendor=1f75, idProduct=0916\r\nAug 29 17:17:14 raspberrypi kernel: [    7.802488] usb 1-1.3.7: New USB device strings: Mfr=1, Product=2, SerialNumber=3\r\nAug 29 17:17:14 raspberrypi kernel: [    7.817159] usb 1-1.3.7: Product: USB Device\r\nAug 29 17:17:14 raspberrypi kernel: [    7.825269] usb 1-1.3.7: Manufacturer: innostor\r\nAug 29 17:17:14 raspberrypi kernel: [    7.832820] usb 1-1.3.7: SerialNumber: 201205300000131\r\nAug 29 17:17:14 raspberrypi kernel: [    7.852816] scsi0 : usb-storage 1-1.3.7:1.0\r\nAug 29 17:17:14 raspberrypi kernel: [    8.863677] scsi 0:0:0:0: Direct-Access   innostor USB 3.0          1.00 PQ: 0 ANSI: 6\r\nAug 29 17:17:14 raspberrypi kernel: [    8.894315] sd 0:0:0:0: [sda] 30720000 512-byte logical blocks: (15.7 GB\/14.6 GiB)\r\nAug 29 17:17:14 raspberrypi kernel: [    8.921697] sd 0:0:0:0: [sda] Write Protect is off\r\nAug 29 17:17:14 raspberrypi kernel: [    9.011710]  sda:\r\nAug 29 17:17:14 raspberrypi kernel: [    9.077682] sd 0:0:0:0: [sda] Attached SCSI removable disk<\/code><\/pre>\n<\/div>\n<p>Der Stick kann also unter dem Namen \/dev\/sda angesprochen werden.<\/p>\n<h3>Partition anlegen<\/h3>\n<p>Mit gdisk (nicht mit fdisk!) wird eine Partition auf dem Stick angelegt. Beim ersten Aufruf erscheint m\u00f6glicherweise folgende Meldung:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# gdisk \/dev\/sda\r\nGPT fdisk (gdisk) version 0.5.1\r\n\r\nPartition table scan:\r\n  MBR: MBR only\r\n  BSD: not present\r\n  APM: not present\r\n  GPT: not present\r\n\r\n***************************************************************\r\nFound invalid GPT and valid MBR; converting MBR to GPT format.\r\nTHIS OPERATON IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if\r\nyou don't want to convert your MBR partitions to GPT format!\r\n***************************************************************<\/code><\/pre>\n<\/div>\n<p>Das geht in Ordnung, da der Stick mit dem GPT-Schema partitioniert werden soll. (GUID Partition Table hat gegen\u00fcber dem MBR-Partitionsschema den Vorteil, dass Partitionen eine eindeutige GUID bekommen)<br \/>\nMit dem d-Kommando werden evt. vorhandene Partitionen dann gel\u00f6scht und mit dem n-Kommando eine neue angelegt.<br \/>\nBeim Speichern mit w erscheint wieder eine Warnung, die ebenfalls mit Y beantwortet werden kann.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">Command (? for help): w\r\n\r\nFinal checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING\r\nMBR PARTITIONS!! THIS PROGRAM IS BETA QUALITY AT BEST. IF YOU LOSE ALL YOUR\r\nDATA, YOU HAVE ONLY YOURSELF TO BLAME IF YOU ANSWER 'Y' BELOW!\r\n\r\nDo you want to proceed, possibly destroying your data? (Y\/N)<\/code><\/pre>\n<\/div>\n<p>Das Wichtige ist jetzt, dass die Partition \/dev\/sda1 eine eindeutige UID bekommen hat. Mit dem Kommando i von gdisk l\u00e4sst man sie sich anzeigen:<\/p>\n<pre>Command (? for help): i\r\nUsing 1\r\nPartition GUID code: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 (Linux\/Windows data)\r\nPartition unique GUID: 81E5BB0B-424E-4C19-8E7C-E678CBB3A588\r\nFirst sector: 2048 (at 1024.0 KiB)\r\nLast sector: 7821278 (at 3.7 GiB)\r\nPartition size: 7819231 sectors (3.7 GiB)\r\nAttribute flags: 0000000000000000\r\nPartition name: 'Linux\/Windows data'\r\n<\/pre>\n<h3>\/-Filesystem kopieren<\/h3>\n<p>Auf der neuen Partition wird nun ein Filesystem erstellt, in das die Inhalte des derzeitigen Root-Filesystems hineinkopiert werden.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# mke2fs -t ext4 -L rootfs \/dev\/sda1\r\nroot@raspberrypi:~# mount \/dev\/sda1 \/mnt\r\nroot@raspberrypi:~# rsync -axv \/ \/mnt<\/code><\/pre>\n<\/div>\n<p>Das neue Filesystem hat ebenfalls eine eindeutige ID erhalten. Man l\u00e4sst sie sich mit dem tune2fs-Befehl anzeigen.<\/p>\n<pre>root@raspberrypi:~# tune2fs -l \/dev\/sda1\r\ntune2fs 1.42.5 (29-Jul-2012)\r\nFilesystem volume name:   rootfs\r\nLast mounted on:          \/mnt\r\nFilesystem UUID:          3ef6e847-75d2-4a31-a895-239ffe23a03c\r\n...\r\n<\/pre>\n<p>Diese UUID ist auf keinen Fall zu verwechseln mit der GUID der Partition!<br \/>\nIn \/dev\/disk\/by-uuid erscheint z.B. die Filesystem-UUID. IMHO w\u00e4re es logischer, wenn hier die Partitions-GUID aufgef\u00fchrt w\u00e4ren.<\/p>\n<h3>Anpassen der Boot-Parameter<\/h3>\n<p>In \/root\/cmdline.txt befinden sich die Parameter, die dem Kernel beim Booten eines Raspberry Pi mitgegeben werden. Defaultm\u00e4ssig steht folgende Zeile drin:<\/p>\n<pre>dwc_otg.lpm_enable=0 rpitestmode=1 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=\/dev\/mmcblk0p2 rootfstype=ext4 rootwait\r\n<\/pre>\n<p>\/dev\/mmcblk0p2 ist die zweite Partition der SD-Karte. Man \u00e4ndert jetzt den Parameter root=, damit das neue Root-Filesystem auf dem Stick gemountet wird.<\/p>\n<pre>dwc_otg.lpm_enable=0 rpitestmode=1 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=\/dev\/sda1 rootfstype=ext4 rootwait<\/pre>\n<p>Eine Sache gibt es hierbei aber zu beachten. Wenn man einen zweiten USB-Stick anschliesst, l\u00e4sst sich nicht vorhersagen, welcher der beiden nach einem Reboot \/dev\/sda und welcher \/dev\/sdb wird. In so einem Fall ist es besser, die GUID der Partition zu verwenden:<\/p>\n<pre>dwc_otg.lpm_enable=0 rpitestmode=1 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=PARTUUID=81E5BB0B-424E-4C19-8E7C-E678CBB3A588 rootfstype=ext4 rootwait<\/pre>\n<p>Damit wird die Root-Partition immer erkannt, egal wieviele Sticks angeschlossen wurden und wie die Reihenfolge der \/dev\/sd*-Eintr\u00e4ge lautet.<\/p>\n<p>Unter Umst\u00e4nden wird nach dem Einschalten der Kernel gestartet, noch bevor sich die USB-Devices gemeldet haben. H\u00e4ngt man ein \u201crootdelay=5\u201d an die Parameterliste, dann wird eine Pause von 5 Sekunden eingelegt, bevor versucht wird, das Rootfilesystem zu mounten. Bis dahin sollte sich der USB-Stick initialisiert haben.<\/p>\n<p>Der Ordnung halber wird noch die \/etc\/fstab angepasst. Das Rootfilesystem bzw. die Device-Spalte kann auf eine der drei folgenden Arten angegeben werden:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">\/dev\/sda1                                  \/   ext4    defaults,noatime,async  0       0\r\nLABEL=rootfs                               \/   ext4    defaults,noatime,async  0       0\r\nUUID=3ef6e847-75d2-4a31-a895-239ffe23a03c  \/   ext4    defaults,noatime,async  0       0<\/code><\/pre>\n<\/div>\n<p>Wie schon angemerkt, ist die Methode 1 nur dann angebracht, wenn nicht mehr als ein USB-Stick oder -Platte angeschlossen sind. Bei Methode 2 ist darauf zu achten, dass nur eins der existierenden Filesysteme das Label rootfs tragen darf. Methode 3 ist zwar am wenigsten leserlich, aber daf\u00fcr am zuverl\u00e4ssigsten.<\/p>\n<p>Wer sich eine Entt\u00e4uschung ersparen will, soll hier aufh\u00f6ren zu lesen und mit seinem Rootfilesystem auf USB gl\u00fccklich sein. Wer wissen will, warum, der soll ans Ende dieses Postings springen. Wer schmerzbefreit ist, soll weitermachen, sich aber hinterher nicht beklagen.<\/p>\n<h2>Raid<\/h2>\n<p>Im n\u00e4chsten Abschnitt wird das Rootfilesystem auf einen Spiegel, bestehend aus zwei USB-Sticks, installiert. Dazu muss zun\u00e4chst ein neuer Kernel gebaut werden, der Raid bzw. MD-Devices ohne Zuhilfenahme einer Init-Ramdisk beherrscht. Also erstmal ein Abstecher in Richtung Kernel\/Firmware-Updates und -Selbercompilieren.<\/p>\n<h3>Firmware updaten<\/h3>\n<p>Auch ohne diese Raid- und USB-Spielereien kann es nicht schaden, immer wieder mal den von Raspberry gebauten Kernel zu aktualisieren.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# mkdir raspberry\r\nroot@raspberrypi:~# cd raspberry\r\nroot@raspberrypi:~# git clone --depth 1 git:\/\/github.com\/raspberrypi\/firmware.git\r\nroot@raspberrypi:~# cd firmware\/boot\r\nroot@raspberrypi:~# cp arm128_start.elf arm192_start.elf arm224_start.elf arm240_start.elf bootcode.bin loader.bin start.elf \/boot<\/code><\/pre>\n<\/div>\n<p>In den .elf-Dateien steckt die Firmware f\u00fcr die GPU. Sie entscheiden dar\u00fcber, wieviel Speicher f\u00fcr die CPU und somit f\u00fcr Linux reserviert wird. Je nachdem, welche dieser Dateien nach start.elf kopiert wird, sind das 128, 192, 224 oder 240 Megabytes. F\u00fcr das Kompilieren des Kernels sollte man sich so viel Speicher wie m\u00f6glich sichern. Das geschieht mit<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">cp \/boot\/arm240_start.elf \/boot\/start.elf<\/code><\/pre>\n<\/div>\n<p>Nach einem Reboot hat der Linux-Kernel den gr\u00f6sstm\u00f6glichen Anteil am eh schon knapp bemessenen Hauptspeicher.<br \/>\nNun werden die Kernelsourcen heruntergeladen und so konfiguriert, dass der MD-Driver und Raid0 fest eincompiliert werden.<\/p>\n<h3>Eigenen Kernel kompilieren<\/h3>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# cd raspberry\r\nroot@raspberrypi:~# git clone --depth 1 git:\/\/github.com\/raspberrypi\/linux.git\r\nroot@raspberrypi:~# cd linux\r\nroot@raspberrypi:~# zcat \/proc\/config.gz &gt; .config\r\nroot@raspberrypi:~# make menuconfig<\/code><\/pre>\n<\/div>\n<p>Im Schritt \u201cmake menuconfig\u201d hangelt man sich durch folgende Men\u00fcpunkte:<\/p>\n<p>Device Drivers \u2014&gt; Multiple devices driver support (RAID and LVM) \u2014&gt; RAID support<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">.config - Linux\/arm 3.2.27 Kernel Configuration\r\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Multiple devices driver support (RAID and LVM) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n  \u2502  Arrow keys navigate the menu.  &lt;Enter&gt; selects submenus ---&gt;.          \u2502\r\n  \u2502  Highlighted letters are hotkeys.  Pressing &lt;Y&gt; includes, &lt;N&gt; excludes, \u2502\r\n  \u2502  &lt;M&gt; modularizes features.  Press &lt;Esc&gt;&lt;Esc&gt; to exit, &lt;?&gt; for Help, &lt;\/&gt; \u2502\r\n  \u2502  for Search.  Legend: [*] built-in  [ ] excluded  &lt;M&gt; module  &lt; &gt;       \u2502\r\n  \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\r\n  \u2502 \u2502    --- Multiple devices driver support (RAID and LVM)               \u2502 \u2502\r\n  \u2502 \u2502    {*}   RAID support                                               \u2502 \u2502\r\n  \u2502 \u2502    [*]     Autodetect RAID arrays during kernel boot                \u2502 \u2502\r\n  \u2502 \u2502    &lt; &gt;     Linear (append) mode                                     \u2502 \u2502\r\n  \u2502 \u2502    &lt;M&gt;     RAID-0 (striping) mode                                   \u2502 \u2502\r\n  \u2502 \u2502    {*}     RAID-1 (mirroring) mode                                  \u2502 \u2502\r\n  \u2502 \u2502    &lt; &gt;     RAID-10 (mirrored striping) mode                         \u2502 \u2502\r\n  \u2502 \u2502    {M}     RAID-4\/RAID-5\/RAID-6 mode                                \u2502 \u2502<\/code><\/pre>\n<\/div>\n<p>Wichtig ist hier, dass bei \u201cRaid Support\u201d und \u201cRaid-1\u201d jeweils der Stern angew\u00e4hlt wird. Nach dem Abspeichern der Konfiguration werden dann der neue Kernel und die Module gebaut. Das kann etliche Stunden dauern.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# make\r\nroot@raspberrypi:~# make modules\r\nroot@raspberrypi:~# cp arch\/arm\/boot\/Image \/boot\/kernel.img\r\nroot@raspberrypi:~# make ARCH=arm modules_install INSTALL_MOD_PATH=\/<\/code><\/pre>\n<\/div>\n<p>Nach einem Reboot kann man pr\u00fcfen, ob der neue Kernel mit Raid-1 umgehen kann:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# dmesg|grep raid\r\n[    2.148591] md: raid1 personality registered for level 1\r\n...<\/code><\/pre>\n<\/div>\n<h3>Aufbauen des Spiegels<\/h3>\n<p>Als n\u00e4chstes wird der zweite USB-Stick eingesteckt. Wenn man mit <b>tail -f \/var\/log\/messages<\/b> die Systemmeldungen mitliest, sieht man, dass er unter \/dev\/sdb angesprochen werden kann. Da er ein Zwillingsbruder des ersten Sticks sein soll, muss dessen Partitionstabelle auf ihn \u00fcbertragen werden.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# sgdisk --replicate \/dev\/sdb \/dev\/sda\r\nThe operation has completed successfully.\r\nroot@raspberrypi:~# sgdisk --randomize-guids \/dev\/sdb\r\nThe operation has completed successfully.\r\nroot@raspberrypi:~# sgdisk --typecode=1:fd00 \/dev\/sdb<\/code><\/pre>\n<\/div>\n<p>Mit dem zweiten Kommando wurde f\u00fcr die Partition sdb1 eine neue GUID generiert, da sie beim Replizieren unver\u00e4ndert vom sda1 \u00fcbernommen wurde. Abschliessend wird der Partitionstyp noch auf \u201cfd00 = Linux RAID\u201d gesetzt.<\/p>\n<p>Mit dem mdadm-Befehl wird nun ein neues Device angelegt, das zun\u00e4chst nur aus einer Spiegelh\u00e4lfte besteht:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# mdadm --create \/dev\/md0 --level 1 --raid-devices=2 --metadata=0.90 missing \/dev\/sdb1<\/code><\/pre>\n<\/div>\n<p>Auf dem Raid1-Device wird dann ein Filesystem angelegt, gemountet und mit dem Inhalt des bisherigen Rootfilesystems bef\u00fcllt:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# mke2fs -t ext4 \/dev\/md0\r\nroot@raspberrypi:~# mount \/dev\/md0 \/mnt\r\nroot@raspberrypi:~# rsync -axv \/ \/mnt<\/code><\/pre>\n<\/div>\n<p>Anschliessend wird das System so vorbereitet, dass es beim Booten den Spiegel als Rootfilesystem mountet. Dazu \u00e4ndert man \/boot\/cmdline.txt folgendermassen:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">dwc_otg.lpm_enable=0 rpitestmode=1 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=\/dev\/md0 rootfstype=ext4 rootwait rootdelay=5<\/code><\/pre>\n<\/div>\n<p>Auch in der \/etc\/fstab wird \/dev\/md0 als Device f\u00fcr das Rootfilesystem eingetragen.<br \/>\nMit dem Kommando \u201cpoweroff\u201d schaltet man den Raspberry Pi nun ab und zieht den ersten Stick (mit dem bisherigen Rootfilesystem auf sda1) ab.<br \/>\nNach einem Reboot sollte nun der Spiegel unter \/ gemountet sein.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# df\r\nFilesystem     1K-blocks    Used Available Use% Mounted on\r\nrootfs          15118600 4141560  10209048  29% \/\r\n\/dev\/root       15118600 4141560  10209048  29% \/\r\ntmpfs              23656     312     23344   2% \/run\r\ntmpfs               5120       0      5120   0% \/run\/lock\r\ntmpfs              47312       0     47312   0% \/tmp\r\ntmpfs              10240       0     10240   0% \/dev\r\ntmpfs              47312       0     47312   0% \/run\/shm\r\n\/dev\/mmcblk0p1     57288   41192     16096  72% \/boot\r\nroot@raspberrypi:~# ls -l \/dev\/root\r\nlrwxrwxrwx 1 root root 3 Aug 30 22:11 \/dev\/root -&gt; md0<\/code><\/pre>\n<\/div>\n<h3>Zweite H\u00e4lfte des Spiegels hinzuf\u00fcgen<\/h3>\n<p>Nun wird der Stick Nr.1 wieder eingesteckt. Diesmal wird er unter dem Namen \/dev\/sdb in \/var\/log\/messages auftauchen. Nachdem auch hier der Partitionstyp auf \u201cLinux RAID\u201d ge\u00e4ndert wurde, kann der Spiegel vervollst\u00e4ndigt werden:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# sgdisk --typecode=1:fd00 \/dev\/sdb\r\nroot@raspberrypi:~# mdadm --manage \/dev\/md0 --add \/dev\/sdb1<\/code><\/pre>\n<\/div>\n<p>In der Datei \/proc\/mdstat kann nun beobachtet werden, wie sich die beiden Spiegelh\u00e4lften synchronisieren:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">root@raspberrypi:~# cat \/proc\/mdstat\r\nPersonalities : [raid1]\r\nmd0 : active raid1 sdb1[2] sda1[1]\r\n      15359872 blocks [2\/1] [_U]\r\n      [&gt;....................]  recovery =  0.3% (60032\/15359872) finish=72.1min speed=3531K\/sec<\/code><\/pre>\n<\/div>\n<h3>Die Blamage<\/h3>\n<p>Und nun die schlechte Nachricht. Das ganze Zeugs l\u00e4uft nicht stabil.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">Aug 31 17:11:44 raspberrypi kernel: [  149.862492] usb 1-1.3.4: reset high-speed USB device number 7 using dwc_otg\r\nAug 31 17:11:58 raspberrypi kernel: [  163.743122] usb 1-1.3.7: reset high-speed USB device number 15 using dwc_otg\r\nAug 31 17:12:28 raspberrypi kernel: [  194.584437] usb 1-1.3.7: reset high-speed USB device number 15 using dwc_otg\r\nAug 31 17:12:59 raspberrypi kernel: [  225.045706] usb 1-1.3.7: reset high-speed USB device number 15 using dwc_otg\r\n...<\/code><\/pre>\n<\/div>\n<p>St\u00e4ndig gibt es USB-Ausf\u00e4lle und eine H\u00e4lfte des Spiegels verschwindet. Ich habe es sowohl mit USB3.0 als auch mit USB2.0-Sticks probiert. Gleiches Ergebnis. Nach ein paar Sekunden h\u00e4ngt \u201ccat \/proc\/mdstat\u201d und irgendwann bleibt es bei<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\" data-lang=\"text\">Personalities : [raid1]\r\nmd0 : active raid1 sdb1[2](F) sda1[1]\r\n      3909504 blocks [2\/1] [_U]<\/code><\/pre>\n<\/div>\n<p>Etliche Versuche mit erweiterten Parametern f\u00fcr den dwc_otg-Treiber haben nichts gebracht. Die Hardware des Raspberry Pi ist wohl zu schwachbr\u00fcstig f\u00fcr so eine Installation. Auch das Abgleichen der beiden Spiegelh\u00e4lften an einem anderen Rechner und Einbauen in den Raspberry Pi in synchronisiertem Zustand hat nichts geholfen.<br \/>\nTut mir leid, bessere Nachrichten habe ich nicht. Ich bin jetzt selber sauer, dass es nicht funktioniert hat, aber das Geschriebene lasse ich trotzdem mal stehen. Vielleicht kann ja der eine oder andere ein paar Informationen davon brauchen.<\/p>\n<p>Fazit: hochscrollen und mit einem einzelnen USB-Stick gl\u00fccklich sein.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quelle: https:\/\/labs.consol.de\/raspberrypi\/2012\/08\/30\/raspberry-pi-mit-spiegel-sticks.html &nbsp; &nbsp; In diesem Post wird gezeigt, wie man einen Raspberry Pi Miniatur-Computer mit einem Root-Filesystem ausstattet, das auf zwei gespiegelten USB-Sticks liegt. Der Raspberry Pi (Modell B) wird mit einem SD-Karten-Leser und zwei USB-Ports geliefert. Das Betriebssystem Raspbian, eine Variante von Debian, wird als Image heruntergeladen und auf eine SD-Karte kopiert. Diese &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.roellig-it.de\/index.php\/2018\/10\/04\/raspberry-pi-mit-spiegel-sticks\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eRaspberry Pi mit Spiegel-Sticks\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-425","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/posts\/425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/comments?post=425"}],"version-history":[{"count":2,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/posts\/425\/revisions"}],"predecessor-version":[{"id":427,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/posts\/425\/revisions\/427"}],"wp:attachment":[{"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/media?parent=425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/categories?post=425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.roellig-it.de\/index.php\/wp-json\/wp\/v2\/tags?post=425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}