You are hereLinux / squashfs

squashfs


Upgrade naar Karmic Koala breekt squashfs

Dit weekend heb ik mijn Crunchbang-installatie op de netbook bijgewerkt naar Karmic Koala. De upgrade zelf ging vlotjes. Ik heb er niet heel de tijd op zitten kijken.

Enkele fragmentjes uit het upgradeproces:

12 pakketten zullen verwijderd worden. 142 nieuwe pakketten zullen geïnstalleerd worden. 741 pakketten zullen een upgrade krijgen.
U moet in totaal 436M downloaden. Deze download duurt met uw verbinding ongeveer 9 minuten.
Het upgraden kan enkele uren in beslag nemen en kan tussentijds niet worden afgebroken.
real    430m39.408s
user      16m4.808s
sys        8m3.086s
Real is zo hoog omdat ik het laten draaien heb terwijl ik naar een film keek.

Helaas, na het rebooten bleek dat ik met een onbruikbaar systeem zit.

General error mounting filesystems.
A maintenance shell will now be started.
CONTROL-D will terminate this shell and re-try.
*gil*
OK, regel 1: DON'T PANIC. Control+D heeft geen enkele zin, want er wordt naar een root wachtwoord gevraagd en zoals we allemaal weten, heeft Ubuntu geen root wachtwoord.

Stap 2: rebooten, op Escape drukken in het Grub-menu, en 'e' om te bewerken. De regel met de kernel vul ik aan zodat er een init bij staat:

kernel  /boot/vmlinuz-2.6.31-14-generic root=LABEL=/ rw init=/bin/bash
Wanneer ik daarmee boot, krijg ik het volgende:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
bash: groups: command not found
root@(none):/#
Nu heb ik tenminste een werkende root shell waarmee ik kan uitvissen wat er aan de hand is.

Ik weet al dat er een probleem is met het mounten van een filesystem, maar welk? Het handmatig proberen mounten van alle filesystems gaf meteen het antwoord:

root@(none):/# mount -a
mount: special device LABEL=/home does not exist
[  282.714817] squashfs: version 4.0 (2009/01/31) Philip Lougher
[  282.720623] SQUASHFS error: Major/Minor mismatch, older Squashfs 3.1 filesystems are unsupported
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

mount: unknown filesystem type 'unionfs'
Aha! Eerst eventjes doen wat er in de foutmelding staat:
root@(none):/ dmesg
[  282.714817] squashfs: version 4.0 (2009/01/31) Philip Lougher
[  282.720623] SQUASHFS error: Major/Minor mismatch, older Squashfs 3.1 filesystems are unsupported
Het probleem is dus duidelijk: bij de overgang van Jaunty naar Karmic, is Squashfs van versie 3.1 naar 4.0 gegaan, en de nieuwe versie is niet backwards compatibel met de oude versie.

Er zit nu niets anders op dan het gesquashte filesystem te unsquashen met de oude versie, en eventueel daarna opnieuw te squashen met de nieuwe versie. Maar hoe? Ik zit met een gebroken systeem.

Gelukkig komt daar weer mijn trouwe usb-stick de redding brengen. Daar stond nog altijd Crunchbang op, van toen ik het geïnstalleerd heb. Maar in principe kan om het even welke andere 9.04 Ubuntu ISO gedownload worden. Die moet dan op de usb-stick gezet worden met unetbootin.

Wanneer Ubuntu 9.04 geboot is vanaf de usb-stick, geef ik volgende commando's:

sudo -i
aptitude install squashfs-tools
modprobe squashfs
modprobe unionfs
mount /dev/sda1 /mnt
mkdir /mnt/usr.old
mount -t squashfs -o ro,loop,nodev /mnt/.filesystems/usr/usr.sqfs /mnt/usr.old
mount -t unionfs -o nodev,noatime,dirs=/mnt/.filesystems/usr/overlay=rw:/mnt/usr.old=ro unionfs /mnt/usr.old
time rsync -av /mnt/usr.old/ /mnt/usr
Het kopiëren nam wel een minuutje of 20 in beslag:
sent 1466696143 bytes  received 1438136 bytes  1256426.43 bytes/sec
total size is 1461396353  speedup is 1.00
rsync warning: some files vanished before they could be transferred (code 24) at main.c(1058) [sender=3.0.5]

real    19m28.192s
user    0m51.755s
sys     2m10.544s
Wat die melding over vanished files wil zeggen, weet ik nog niet, maar ik ga er mij ook geen zorgen over maken. Wanneer ik rsync nog eens uitvoer, krijg ik dit:
sending incremental file list
file has vanished: "/mnt/usr.old/lib/graphviz/config4"

sent 2434876 bytes  received 9508 bytes  212555.13 bytes/sec
total size is 1461396353  speedup is 597.86
rsync warning: some files vanished before they could be transferred (code 24) at main.c(1058) [sender=3.0.5]

real    0m10.500s
user    0m2.820s
sys     0m9.461s
In het slechtste geval is er dus iets mis met graphviz. Niets dat een herinstallatie van het pakket niet kan oplossen.

In /mnt/etc/fstab moeten ook nog (tijdelijk) 2 regels in commentaar gezet worden:

#/.filesystems/usr/usr.sqfs /usr squashfs ro,loop,nodev  0       0
#unionfs         /usr            unionfs nodev,noatime,dirs=/.filesystems/usr/overlay=rw:/usr=ro 0 0
Op die manier gaat Ubuntu niet meer proberen om het squashfs-filesystem te mounten.

Nu is het tijd voor een reboot. Werkt het nu? Neen... *gil*
Ok, opnieuw: DON'T PANIC. Wat is het probleem?

One or more of the mounts listed in /etc/fstab cannot yet be mounted:
(ESC for recovery shell)
/: waiting for /dev/disk/by-label/\134x2f
/home: waiting for /dev/disk/by-label/\x2fhome
Mijn eerste reactie is: onze Koala kan niet overweg met disklabels waar een / in staat. Dat heb ik oorspronkelijk wel gedaan bij het partitioneren. Het gemakkelijkste om de disklabels te hernoemen, is om opnieuw te booten met de usb-stick.
sudo e2label /dev/sda1 root
sudo e2label /dev/mmcblk0 home
/etc/fstab moet ook nog overeenkomstig aangepast worden. Let op: de /etc/fstab op /dev/sda1, dus eerst mounten op /mnt en dan /mnt/etc/fstab aanpassen. De nieuwe versie van /etc/fstab is nu:
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults              
LABEL=root      /               ext4    noatime,errors=remount-ro        1
LABEL=home      /home           ext4    noatime                2
LABEL=swap      none            swap    sw                    
tmpfs           /tmp            tmpfs   defaults              
tmpfs           /var/tmp        tmpfs   defaults              
tmpfs           /var/cache/apt/archives tmpfs  defaults        

# /.filesystems/usr/usr.sqfs /usr squashfs ro,loop,nodev  
# unionfs /usr unionfs nodev,noatime,dirs=/.filesystems/usr/overlay=rw:/usr=ro  
Ook in /boot/grub/menu.lst moet nog aangepast worden dat het root device nu niet / maar root heet. This is left as an excercise to the reader...

Linux liposuctie: Crunchbang in minder dan 1 gigabyte op de Acer Aspire One

Deze blogpost is een bewerking van http://po-ru.com/diary/linux-liposuction-or-xubuntu-in-under-a-gig-on-th.... Daar wordt er (X)Ubuntu Intrepid (8.10) gebruikt, terwijl mijn versie gericht is op Jaunty (9.04) en Karmic (9.10), meer bepaald de Crunchbang-variant met OpenBox desktop.

In een vorige blogpost heb ik 180 MiB vrijgemaakt door overbodige software en overbodige locales te verwijderen.

Ik heb di en du gebruikt om te achterhalen waar het meeste schijfruimte wordt verbruikt:

$ di -hm /
Filesystem         Mount               Megs     Used    Avail %Used fs Type
/dev/sda1          /                 6099.6   1887.6   4212.0  31%  ext4  
$ sudo du -cms /* 2>/dev/null | column -tc 2 | grep -v "^0 " | sort -nr | head -n 11
2649  total
1396  /usr
900   /home
192   /var
124   /lib
16    /boot
8     /sbin
8     /etc
6     /bin
1     /tmp
1     /srv
Het meeste plaats wordt ingenomen door /usr: 1396 MiB. Dit kan verkleind worden, met een combinatie van squashfs en unionfs.

squashfs laat je een filesystem comprimeren, maar het is read-only. unionfs laat je toe om er een schrijfbaar filesystem bovenop te leggen, zodat je gegevens kan wijzigen. Uiteraard, hoe meer data je wijzigt, hoe meer schijfruimte er gebruikt wordt, maar het is altijd mogelijk om opnieuw te comprimeren en de schijfruimte te herwinnen.

Eerst moet squashfs geinstalleerd worden. unionfs zit al standaard in de kernel bij Jaunty en Karmic, en moet dus niet meer geïnstalleerd worden.

$ sudo aptitude install squashfs-tools
Dan moet er een plaats voorzien worden voor het gecomprimeerde filesystem en de overlay:
$ sudo mkdir -p /.filesystems/usr/overlay
Comprimeer het filesystem:
$ sudo mksquashfs /usr /.filesystems/usr/usr.sqfs
Voeg deze regels toe aan /etc/modules:
unionfs
squashfs
loop
en deze regels aan /etc/fstab:
/.filesystems/usr/usr.sqfs /usr squashfs ro,loop,nodev
unionfs /usr unionfs nodev,noatime,dirs=/.filesystems/usr/overlay=rw:/usr=ro
Sluit alle programma's af, ga naar runlevel 1 (of reboot en ga in de rescue mode) en zet de oude /usr-directory opzij:
$ sudo init 1
$ mv /usr /usr.old
$ mkdir /usr
$ mount -a
$ init 3
Werkt alles OK, ook na een reboot, dan mag /usr.old verwijderd worden.

Het schijfgebruik is nu:

$ di -hm /
Filesystem         Mount               Megs     Used    Avail %Used fs Type
/dev/sda1          /                 6099.6    954.9   4834.9  21%  ext4  
Er is dus 932,7 MiB vrijgekomen. Dat komt overeen met het verschil in grootte tussen /usr en  :
$ sudo du -ms /usr /.filesystems/usr
1396    /usr
464     /.filesystems/usr

Opmerking: bij mij deed readahead een beetje lastig tijdens het booten. Dit probleem staat ook beschreven in deze forumtopic. Aangezien readahead alleen maar zinvol is bij een harde schijf maar niet bij een SSD, heb ik readahead ineens verwijderd:

$ sudo aptitude purge readahead

Reclame... ;-)

Met dank aan
  • Jasmina
  • Celine
  • Pieter
  • Jeff
  • Hans
  • Jurgen
  • Jurgen
  • Marijke
  • Amedee
  • Erik
  • Danny
  • Sofie
  • Lars
  • Christophe
  • Peter
  • Jeroen
  • Jurgen
om mij een gratis herlading twv €15 te bezorgen!

Waar ben ik?