1. SSD und Ubuntu

SSD und Ubuntu

Will ich ein Ubuntu-Linux-System mit einer SSD betreiben, gibt es einen Haufen Empfehlungen zu beachten.
Hier ist mein Weg da durch.

Was hat unsere SSD für Eigenschaften?

fdisk -l /dev/sda|grep -i se[ck]tor # Find out your hard disk information

So könnte das aussehen

255 heads, 63 sectors/track, 4865 cylinders

oder auch so:

255 Köpfe, 63 Sektoren/Spur, 14593 Zylinder, zusammen 234441648 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
  1. SSD und Ubuntu
  1. Partitionieren
  2. Journaling ausschalten
  3. /etc/fstab
    1. Tmpfs
      1. In Tmpfs kompilieren
    2. Ausschnitt aus meiner /etc/fstab
    3. Mount-Optionen für SSDs
  4. Swap und swappiness
  5. Eine SSD braucht keinen Disk Head Scheduler
  6. Caches nach tmp verlegen
    1. Browser-Profile in die Ramdisk verlegen
    2. Ad Hoc für Ungeduldige: Caches nach tmp verlegen
    3. Firefox cache
  7. Neustart
  8. Quellen
  9. Anhang
    1. Die komplette fdisk-Session

Partitionieren

Jetzt wird die SSD mit einer zur Erase-Block-Size passenden Block-Size partitioniert (und später formatiert):

sudo fdisk -H 255 -S 63 /dev/sda <Return>
o    <Return>
n    <Return>
     <Return>  # Primary
     <Return>  # 1 stimmt
     <Return>  # Erster Sektor (2048) stimmt so
+10G <Return>  # das wird /
n    <Return>
     <Return>  # Primary
     <Return>  # 2 stimmt
     <Return>  # Erster Sektor stimmt so
+10G <Return>  # auch / bzw. /rescue: alternative Linux-Boot+Rootpartition für Experimente & Rescue
n    <Return>
     <Return>  # Primary
     <Return>  # 3 stimmt
     <Return>  # Erster Sektor stimmt so
+30G <Return>  # das wird die Windows-Partition für meine Steuererklärung und andere Experimente
n    <Return>
e    <Return>  # Extended
     <Return>  # 4 stimmt
     <Return>  # Erster Sektor stimmt so
     <Return>  # Letzter Sektor stimmt so
n    <Return>
     <Return>  # Erster Sektor stimmt so
+4G  <Return>  # das wird  -swap-  für den Ruhezustand
n    <Return>
     <Return>  # Erster Sektor stimmt so
+10G <Return>  # das wird /var
n    <Return>
     <Return>  # Erster Sektor stimmt so
     <Return>  # Letzter Sektor stimmt so  # das wird /home
t    <Return>
3    <Return>  # Windows-Partition
7    <Return>  # NTFS etc.
t    <Return>
5    <Return>  # swap-Partition
82   <Return>  # swap
p    <Return>  # gut anschaun, ob alles so stimmt:

gut anschaun, ob alles so stimmt:

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 Köpfe, 63 Sektoren/Spur, 14593 Zylinder, zusammen 234441648 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x5a0bd3a1

   Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sda1            2048    20973567    10485760   83  Linux
/dev/sda2        20973568    41945087    10485760   83  Linux
/dev/sda3        41945088   104859647    31457280    7  HPFS/NTFS/exFAT
/dev/sda4       104861694   234441647    64789977    5  Erweiterte
/dev/sda5       104861696   113250303     4194304   82  Linux Swap / Solaris
/dev/sda6       113252352   134223871    10485760   83  Linux
/dev/sda7       134225920   234441647    50107864   83  Linux

wirklich gut anschaun, ob alles so stimmt. Dann:

w    <Return>  # die neue Partitionstabelle schreiben.

Weiter geht es nach einem Reboot;

sudo reboot

Überlegung: Wir wollen häufiges Schreiben auf der SSD unterbinden, denn es geht das Gespenst um, dass das die Lebenszeit der SSD arg verringert (beispielsweise von ca. 8 auf "nur" ca, 5 Jahre).

  • swap: Mit einer SSD will man also nicht Swappen. Wer allerdings den Ruhezustand seines Rechners nutzen möchte, muss eine Swap-Partition in der Größe des Hauptspeichers anlegen. Wir wollen daher zwar Swap, aber den möglichst nicht benutzen. Dazu später mehr
  • /tmp kommt in die Ramdisk.
  • /var bleibt auf der SSD, weil dort viel geschrieben wird und daher die hohe Schreibgeschwindigkeit der SSD benötigt; bekommt aber um bei Crashes nicht / vollzumüllen "for better crash recovery" oder falls ein Programm zu viel loggt eine eigene Partition.
  • Erase-Block-Size: Sehr wichtig bei der Partitionierung einer SSD ist das Beachten der EBS (erase block size) der SSD. Die EBS variiert herstellerbedingt, und offizielle Angaben dazu sind teils rar. Ist es nicht möglich, die EBS in Erfahrung zu bringen, soll von 512 KiB ausgegangen werden,

ferner liefen

  • Fdisk Parameter mußten einmal von Hand ermittelt und fdisk übergeben werden, Das geht wohl nun automatisch. Dennoch gebe ich sie mal so an.

Hier ist der beste Zeitpunkt für die Windows-Installation.

Für Ubuntu-Leute ist das folgende eher uninteressant. Während der Installationsfragen stattdessen immer schön EXT4-Journaling-Dateisystem auswählen.

# ... format your disk aligning the partition blocksize to the SSD erase block size...
# ...with the above information (5 partitions, swap, no journaling ext4):
sudo mke2fs -t ext4 -O ^has_journal /dev/sda1 
sudo fsck -f  /dev/sda1
sudo mke2fs -t ext4 -O ^has_journal /dev/sda2 
sudo fsck -f  /dev/sda2
sudo mke2fs -t ext4 -O ^has_journal /dev/sda6 
sudo fsck -f  /dev/sda6
sudo mke2fs -t ext4 -O ^has_journal /dev/sda7 
sudo fsck -f  /dev/sda7

Das EXT4-Dateisystem und seine potentiellen Nachfolger unterstützen TRIM.

Das Journaling stellen wir dann später mit tune2fs ab.

Ohne Journal ist Datenverlust wahrscheinlicher als mit, wenn ein Dateisystem nicht sauber unmountet wird (etwa bei Stromausfall). Dafür lebt die SSD womöglich ein paar Jahre länger.

Hier ist der Zeitpunkt für die Linux-Installation.

Journaling ausschalten

Die folgenden Änderungen sind nur möglich, wenn die Dateisysteme nicht gemountet sind.
Nach Abschluß der Installationsroutine noch einmal mit der CD booten.

Ubuntu ausprobieren auswählen.

abwarten, bis der Rechner von CD gebootet hat.

Eine Shell erlangen, etwa mit F2 und gnome-terminal

sudo tune2fs -O ^has_journal /dev/sda1
sudo tune2fs -O ^has_journal /dev/sda2
sudo tune2fs -O ^has_journal /dev/sda6
sudo tune2fs -O ^has_journal /dev/sda7

Das kann man auch ganz wunderbar in eine Zeile schreiben. Ich hab es lieber einzeln abgeschlossen.

sudo fsck.ext4 -f /dev/sda1
sudo fsck.ext4 -f /dev/sda2
sudo fsck.ext4 -f /dev/sda6
sudo fsck.ext4 -f /dev/sda7

Es soll schon Probleme mit nicht automatisch mountenden Partitionen gegeben haben, wo der fsck ausgelassen wurde, drum steht er hier. Dank SSD ist der fsck äußerst schnell, also nicht wundern.

Auch das kann man ganz wunderbar in eine Zeile schreiben (s.o.).

Nach dem nächsten Restart, probiere folgendes:

dmesg | grep EXT4

Das sollte u.a. folgendes ausspucken, wenn alles geklappt hat:

EXT4-fs (sda1): mounted filesystem without journal
EXT4-fs (sda6): mounted filesystem without journal
EXT4-fs (sda7): mounted filesystem without journal
Falls Du das Journal gerne wieder einschalten willst, einfach die Prozedur wiederholen - nur das Dach ^ beim tune2fs-Kommando weglassen.

/etc/fstab

Tmpfs

Der System-Cache lagert in /tmp. In /etc/fstab geben wir an, es im RAM anzulegen, damit weniger auf die SSD geschrieben wird.

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0

Testen!

mount -oremount tmpfs

In Tmpfs kompilieren

Absichtlich in /tmp zu kompilieren ist eine schlaue Idee um die SSD zu schonen. Für Rechner mit >4 GB RAM kann die tmp-Zeile in /etc/fstab mit der size=-Option dazu verwendet werden, mehr als die Hälfte des physischen Hauptspeichers zu belegen.

Beispiel für eine Rechner mit 8 GB echtem RAM:

tmpfs /tmp tmpfs nodev,nosuid,size=7G 0 0

Ausschnitt aus meiner /etc/fstab

Hier der relevante Ausschnitt aus meiner /etc/fstab:

UUID=cae118db-d8f8-4e2c-905e-1a07ad396a3b /     ext4 discard,noatime,errors=remount-ro 0 1
# /home was on /dev/sda7 during installation
UUID=58bf619b-a49e-49f8-bc36-7cc6ada4985c /home ext4 defaults,discard,noatime 0 2
# /var was on /dev/sda6 during installation
UUID=b223cc2e-795d-436e-b5de-8d3b31bcc38a /var  ext4 defaults,discard,noatime 0 2
# swap was on /dev/sda5 during installation
UUID=3a7aacf7-caae-4d5e-9b19-e2c7af7d4a4f none  swap sw              0 0
/dev/sr0     /media/floppy0  auto rw,user,noauto,exec,utf8 0 0

tmpfs        /tmp   tmpfs defaults,noatime,mode=1777,nodev,nosuid 0 0

Mount-Optionen für SSDs

  • discard erlaubt es dem ext4-Filesystem, TRIM zu verwenden. Neuere SSDs erlauben das TRIM-Kommando, das zu besseren Zugriffszeiten führt, da es dem Betriebssystem ermöglicht, der SSD zu sagen, welche Blöcke unbenutzt sind.
  • noatime reduziert die Lesezeiten und die Lebenszeit der SSD, weil nun keine access time updates mehr geschrieben werden müssen, wenn eine Datei gelesen wird. Es beinhaltet auch die Option nodiratime, die nicht noch zusätzlich angegeben werden muß.

Swap und swappiness

Folgende Zeile zu /etc/sysctl.conf hinzufügen:

vm.swappiness=0

Der Rechner hat mit 4 GB deutlich mehr RAM als er braucht, Daher reduziere ich den Wert für swappiness auf 0 und sage damit Linux, es soll nur dann swappen, wenn es gar nicht anders geht,

Eine SSD braucht keinen Disk Head Scheduler

Mögliche Optionen für den Disk Head Scheduler erhalten wir so:

cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

Die Liste der Optionen für unseren Disk Head Scheduler.

Sollte deadline dabei sein, dann ist das die beste Wahl.

Alternative: Falls nicht, ginge auch noch noop sehr gut:

In /etc/rc.local diese beiden Zeilen über der Zeile exit 0 einfügen:

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

alternativ in /etc/rc.local diese Zeile über der Zeile exit 0 einfügen:

echo noop > /sys/block/sda/queue/scheduler

Caches nach tmp verlegen

Browser-Profile in die Ramdisk verlegen

Die Browserprofile von chromium, firefox, opera usw. kann man leicht in die Ramdisk verlegenund mit rsync auf die SSD backupen. Das macht die Browser zum einen schneller, zum anderen spart es Schreibzugriffe auf die SSD.

Im AUR gibt es verschiedene Packete, die das automatisieren, zum Beispiel den profile-sync-daemon.

Ad Hoc für Ungeduldige: Caches nach tmp verlegen

Vermutlich hat die folgende Lösung mehr als einen Pferdefuß, ich hatte es nun einfach eilig:

mv .cache ._cache;ln -s /tmp .cache
mv .thumbnails/ ._thumbnails;ln -s /tmp .thumbnails
mv .opera/thumbnails/ .opera/_thumbnails;ln -s /tmp .opera/thumbnails

Ich mochte dann doch schnell ans Ziel gelangen und beschäftige mich mit dem profile-sync-daemon dann später.

Firefox cache

Im Firefox about:config öffnen. Rechtsklick in einem leeren Bereich und dann "New" und "string value" auswählen. Die soll browser.cache.disk.parent_directory heissen. Als value dann /tmp oder auch /tmp/firefox-cache eingeben.

Firefox legt seinen Cache ins $HOME-Verzeichnis. Wenn man den in die Ramdisk verlegt, macht das den Browser zum einen schneller, zum anderen spart es Schreibzugriffe auf die SSD.

Neustart

Das alles funktioniert erst nach einem Neustart,
Immer gut, eine Boot-CD zur Hand zu haben, falls etwas unerwartet schief gehen sollte.

Quellen


Anhang

Die komplette fdisk-Session

root@ostend:~# sudo fdisk -H 255 -S 63 /dev/sda

Befehl (m für Hilfe): o
Building a new DOS disklabel with disk identifier 0x34582742.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warnung: Schreiben wird ungültiges Flag 0x0000 in Part.-tabelle 4 korrigieren

Befehl (m für Hilfe): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
Partitionsnummer (1-4, Vorgabe: 1): 
Benutze den Standardwert 1
Erster Sektor (2048-234441647, Vorgabe: 2048): 
Benutze den Standardwert 2048
Last Sektor, +Sektoren or +size{K,M,G} (2048-234441647, Vorgabe: 234441647): +10G

Befehl (m für Hilfe): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 
Using default response p
Partitionsnummer (1-4, Vorgabe: 2): 
Benutze den Standardwert 2
Erster Sektor (20973568-234441647, Vorgabe: 20973568): +10G
Wert außerhalb des Bereichs.
Erster Sektor (20973568-234441647, Vorgabe: 20973568): 
Benutze den Standardwert 20973568
Last Sektor, +Sektoren or +size{K,M,G} (20973568-234441647, Vorgabe: 234441647): +10G

Befehl (m für Hilfe): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): 
Using default response p
Partitionsnummer (1-4, Vorgabe: 3): 
Benutze den Standardwert 3
Erster Sektor (41945088-234441647, Vorgabe: 41945088): 
Benutze den Standardwert 41945088
Last Sektor, +Sektoren or +size{K,M,G} (41945088-234441647, Vorgabe: 234441647): +30G

Befehl (m für Hilfe): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Partition 4 ausgewählt
Erster Sektor (104859648-234441647, Vorgabe: 104859648): 
Benutze den Standardwert 104859648
Last Sektor, +Sektoren or +size{K,M,G} (104859648-234441647, Vorgabe: 234441647): 
Benutze den Standardwert 234441647

Befehl (m für Hilfe): n
All primary partitions are in use
Adding logical partition 5
Erster Sektor (104861696-234441647, Vorgabe: 104861696): 
Benutze den Standardwert 104861696
Last Sektor, +Sektoren or +size{K,M,G} (104861696-234441647, Vorgabe: 234441647): +4G

Befehl (m für Hilfe): n
All primary partitions are in use
Adding logical partition 6
Erster Sektor (113252352-234441647, Vorgabe: 113252352): 
Benutze den Standardwert 113252352
Last Sektor, +Sektoren or +size{K,M,G} (113252352-234441647, Vorgabe: 234441647): +10G

Befehl (m für Hilfe): n
All primary partitions are in use
Adding logical partition 7
Erster Sektor (134225920-234441647, Vorgabe: 134225920): 
Benutze den Standardwert 134225920
Last Sektor, +Sektoren or +size{K,M,G} (134225920-234441647, Vorgabe: 234441647): 
Benutze den Standardwert 234441647

Befehl (m für Hilfe): t
Partitionsnummer (1-7): 5
Hex code (L um eine Liste anzuzeigen): 82
Der Dateisystemtyp der Partition 5 ist nun 82 (Linux Swap / Solaris)

Befehl (m für Hilfe): t
Partitionsnummer (1-7): 3
Hex code (L um eine Liste anzuzeigen): 7
Der Dateisystemtyp der Partition 3 ist nun 7 (HPFS/NTFS/exFAT)

Befehl (m für Hilfe): p          

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 Köpfe, 63 Sektoren/Spur, 14593 Zylinder, zusammen 234441648 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x34582742

   Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sda1            2048    20973567    10485760   83  Linux
/dev/sda2        20973568    41945087    10485760   83  Linux
/dev/sda3        41945088   104859647    31457280    7  HPFS/NTFS/exFAT
/dev/sda4       104859648   234441647    64791000    5  Erweiterte
/dev/sda5       104861696   113250303     4194304   82  Linux Swap / Solaris
/dev/sda6       113252352   134223871    10485760   83  Linux
/dev/sda7       134225920   234441647    50107864   83  Linux

Befehl (m für Hilfe): w