Wie binde ich eine neue Festplatte in ein laufendes Linux-System ein?

Hier kommt jetzt einer der großen Vorteile von dem "mount" Prinzip zutage. Hast du unter Windows z.B. eine zweite Festplatte eingebaut, kannst du sie nur benutzen, für neue Programme und für Sachen, die noch nicht installiert sind -- z.B. einfach `C:\Programme' nach `D:\' verschieben ist nicht ohne weiteres drin. Windows ist halt doof ;)

Unter Linux ist das ohne weiteres möglich: Man kann einen kompletten Verzeichnisbaum auf eine andere Partition verschieben, ohne daß sich auch nur ein popeliger Pfadname fuer die Programme ändert -- und das ohne `Tricks' oder Editieren von hundert Konfigurationsdateien.

Wie das geht, wird hier kurz erläutert. Es gibt mehrere Möglichkeiten.

Wichtig Diese Beschreibungen nutzen die Kommandozeile, da dies überall funktioniert. Aktuelle Distributionen haben normalerweise grafische Tools für die Partitionierung (z.B. YaST bei SuSE). Was du benutzt, ist dir überlassen. :-)_

Szenario:

Du hast Linux "nur mal zum Testen" installiert und willst aber jetzt etwas mehr draus machen, weil es Dir gefällt. Du hast eine Partition `/dev/hda1' für DOS/Windows, eine Partition `/dev/hda2' für Linux und eine Partition `/dev/hda3' für Linux-SWAP. `hda2' ist viel zu klein geworden und du hast dir eine zweite Festplatte gekauft, die jetzt unter Linux `/dev/hdb' heißt und die du für einen Teil des laufenden Linux benutzen willst, wir nehmen mal als Beispiel das `/usr' Verzeichnis.

Daß sämtliche Aktionen als `root' erfolgen müssen, muß ich ja wohl nicht extra erwähnen. Daß man vorher alles unnötige runterfahren sollte, am besten mit init S (single-user modus), ist wohl auch klar. Und daß man so etwas eigentlich NIE ohne Backup wenigstens von `/etc' und deiner Daten (`/home/*') macht, naja...

Vorkehrungen

Erstell mit deinem Lieblingspartitionierer (ich nehme cfdisk, der ist am übersichtlichsten; das Ur-fdisk ist aber auch nicht unbedingt falsch) auf der neuen Platte eine Partition:

        $ fdisk /dev/hdb
        Command (m for help): n
        New Partition: (p)rimary (e)xtended: p
        Partition number: 1
        First Cylinder (1-XXXX): 1
        Last Cylinder or ... ([1]-XXXX): XXXX  (Größe auswählen)
        Command (m for help): p

jetzt sollte deine Partition erscheinen. Bisher wurden noch keine Änderungen gemacht: die werden erst mit w geschrieben!

        Command (m for help): w

Wenn es keine Fehlermeldungen gibt, kannst du ohne Neustart auf der neuen Partition ein Dateisystem anlegen ("formatieren" im DOS Jargon):

        mke2fs /dev/hdb1             oder
        mkreiserfs /dev/hdb1         oder
        ....

Wenn er hiermit fertig ist, hast du eine fertige Partition. Du mußt Dir jetzt nur noch klar sein, wie bzw. wo du sie benutzen willst.

Erstell Dir ein Verzeichnis, in welchem Du die neue Partition sehen willst (z.B. `/newdisk'). Trag in die Datei `/etc/fstab' folgendes ein:

        /dev/hdb1       /newdisk   XXXXXX    defaults        1       1

wobei du "XXXXXX" durch ext2 oder reiserfs oder deinen Dateisystemtyp ersetzt, je nach dem was du benutzt hast.

Diese Zeile hängt die neue Partition beim Booten dann automatisch in das Verzeichnis `/mnt'. Aber halt -- du brauchst nicht neustarten; wir sind hier ja schließlich nicht unter Windows! Einfach einmal

        mount /newdisk              oder
        mount /dev/hdb1

eingeben, den Rest holt er sich aus der Datei `fstab', die Du ja gerade angepaßt hast. So! Jetzt müßte ein

        df

eigentlich unter anderem Deine neue Partition anzeigen - die ja noch völlig leer ist. Weiter im Takt: Jetzt suchst Du dir eine der folgenden Möglichkeiten aus. Am besten lese sie alle einmal durch und benutze die, die Du dir am ehesten zutraust. ;-)


Möglichkeit Eins: Mehrere Verzeichnisse von vollen Partitionen auf die neue Platte verschieben, Links zurücklegen

Such dir ein paar Verzeichnisse, die überquellen und die Du gerne auf der neuen Partition hättest. Ich nehme hier jetzt als Beispiele `/home', `/usr/X11' und `/var/spool'. Erstelle Unterverzeichnisse auf der neuen Partition, die ja jetzt unter `/mnt' hängt. Diese können beliebig heißen, aber sinngemäß wären natürlich "passende" Namen. Dann kopiere alle Dateien aus den diversen Verzeichnissen in diese neu angelegten.

       $ mkdir /mnt/usrX11     ; cp -av /usr/X11/* /mnt/usrX11
       $ mkdir /mnt/spool      ; cp -av /var/spool/* /mnt/spool
       $ mkdir /mnt/home       ; cp -av /home/* /mnt/home

Wenn alles angekommen ist, d.h. es keine Fehlermeldungen gab, und Du die obigen Aktionen auch als root ausgeführt hast, sollte die neue Partition folgendermassen aussehen:

       drwxr-xr-x   2 root     root         1024 Feb 21 22:08 home
       drwxr-xr-x   3 root     root         1024 Feb 21 22:18 spool
       drwxr-xr-x   2 root     root         1024 Feb 21 22:28 usrX11

Wenn du ueberall mal reingeguckt hast, und alles normal aussieht, (Pruefen mit z.B. ls -R /usr/X11 | wc ; ls -R /mnt/usrX11 | wc. wc zählt die Anzahl Wörter (hier: Dateien), wenn die identisch sind, duerfte alles in Ordnung sein), kannst du die Originalverzeichnisse killen:

       $ rm -rfv /usr/X11 /var/spool /home

Hier zeigt sich, wieso man alles runterfahren soll: Jetzt hängt dein System für kurze Zeit "in der Luft". Aber das ändert sich schon wieder: Wir legen für alle drei Verzeichnisse symbolische Links auf die Originalplätze.

       $ ln -s /mnt/usrX11 /usr/X11
       $ ln -s /mnt/spool /var/spool
       $ ln -s /mnt/home /home

Links wären unter DOS querverbundene Dateien und sind nicht erlaubt. Unter Linux (bzw. Unix allgemein) gibt es sowas schon seit 30 Jahren und es ist ein ganz normales Prinzip. Ab sofort wird jedes Programm, was z.B. auf irgendetwas unterhalb von `/home' zugreifen will, vom Dateisystem automagisch auf `/mnt/home' umgeleitet -- ohne daß dieses Programm

Also, ich kann ohne dieses primtiv-geniale Konzept nicht mehr leben. :-)


Möglichkeit zwei: Ein Verzeichnis komplett verschieben, Partition dann dort mounten

Einfacher als vorher: Wir schieben einfach komplett `/usr' auf die neue Partition, und mounten dann die neue Partition direkt als `/usr'. Also:

 /dev/hdb1       /usr    XXXXXX    defaults        1       1

in die `/etc/fstab' eintragen, und dann

 $ mv /usr /usr.old      # Altes /usr umbenennen
 $ mkdir /usr            # neues erstellen
 $ mount /usr            # Neue Partition in /usr einklinken
 $ cp -av /usr.old /usr  # Alles rüberschaufeln
 $ rm -rfv /usr.old      # wenns erfolgreich war, killen (*)

Feddich. (*) Das kann man auch später machen, wenn das neue System getestet wurde und läuft. Das "unflexible" hier ist, daß man sich einen Verzeichnisbaum aussuchen muß, den man komplett auf die neue Partition schiebt. Das "Stückeln" (hier n bissl, dort n bissl) von der Lösung 2 geht nicht.


Möglichkeit drei: Partition Magic (kostet Geld)

Man besorge sich Partition Magic von Powerquest (http://www.powerquest.com). Partition Magic kann Linux Partitionen genauso behandeln wie DOS-, Win95, NT und OS/2 Partitionen, d.h. vergrößern/verkleinern, verschieben, und so weiter, und in der letzten mir bekannten Version gab es auf der CD auch zwei Diskettenimages, von denen man eine DOS-Version booten kann, so daß man nicht erst Windows installieren muss, um seine Linux-Partitionen zu bearbeiten. :-)


Möglichkeit vier: Logical Volume Manager (LVM)

Es ist eigentlich unfair, das hier zu erwähnen, aber der LVM (http://www.sistina.com/lvm) für Linux, seit 2.4 offiziell im Kernel, hätte dieses Problem elegant vermeiden können, wenn man ihn von vorn herein benutzt hätte.

Der LVM schiebt eine zusätzliche Schicht zwischen Partitionen und Dateisystme (oder ersetzt, optional, auch das Partitionenprinzip), und fügt statdessen *Volumes* ein. Ein Volume hat gegenüber einer Partition folgende Vorteile:

Haken 1: Die Anwendung ist *nicht* trivial. Man muss sich etwas reinarbeiten, das ist aber bei jedem Volume Management System so. Wenn man viel partitioniert und Flexibilität benötigt, dann ist das auf jeden Fall eine gute Alternative.

Haken 2: Es gibt keine Möglichkeit (abgesehen vom Backup + Restore), eine bestehende fixe Partitionierung in ein Volume-Set umzuwandeln, und auch keine Bestrebungen diesbezüglich, da sich der Aufwand nicht lohnt (diejenigen, die den LVM einsetzen, haben i.A. sowieso tägliche Backups - also spielt man halt ein Backup zurück, was man gerade gemacht hat.)


Nachspiel

Wenn man mit dem ganzen Kladderadamsch fertig ist, fährt man sein System mit init 3 oder init 2 (oder init 5 -- je nach Mondphase mal pi) wieder hoch, und freut sich. Daß das alles -- falls fdisk nicht gemeckert hat, das ist IMHO hardwareabhängig -- ohne einen einzigen Neustart von sich ging, ist doch selbstverständlich. :)

JensBenecke