You are hereMonthly archive / November 2009

November 2009


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...

Wordle

Wordle

Na het zien van BVLG z'n wordle was ik nieuwsgierig naar mijn eigen plaatje.
Blijkbaar ben ik de laatste tijd dikwijls bezig geweest over squashfs en unionfs.

Foto's in batch verkleinen met imagemagick

Gisteren stelde Monica Monté een interessante vraag op Twitter: "Bestaat er een manier om een hoop foto's (+100) in een batch te verkleinen (7mb >1mb) Via Photoshop, Lightroom, Bridge,...?"

Ik vind het een rare vraag omdat bestandsgrootte een ééndimensionaal gegeven is, terwijl foto's eigenlijk 3 dimensies hebben: lengte, breedte en kleurdiepte. Of 2 dimensies, als je alleen van lengte en breedte spreekt, en het aantal kleuren gelijk blijft in je omzetting. Bovendien, bij JPEG-compressie (daar bleek het achteraf inderdaad om te gaan) is het bij een foto waarvan je alleen de lengte en breedte weet, quasi onmogelijk om te voorspellen wat de bestandsgrootte gaat zijn, zonder het jpeg-compressiealgoritme uit te voeren. 2 verschillende foto's maar met exact dezelfde lengte en breedte zullen meestal een verschillende grootte hebben. Soit, Monica moet bij gelegenheid maar eens uitleggen wat ze bedoelde.

Er waren direct een aantal mensen die deze sympathieke fotoredactrice ter hulp snelden met hun advies voor zware softwarepakketten zoals Lightroom (@Jannemans, @mbargo, @bartclaeys, @Schuppe), iPhoto (@boskabout), Photoshop (@broodkast, @kodel, @eyeballkid), Picasa (@raf__) en Irfanview (@vdbvdb). @robindheer zat ook met dezelfde vraag: hoe verklein je foto's in batch?

Maar mensen, waarom allemaal zo moeilijk doen? Zoals ik gisteren al schreef op Twitter: het in batch verkleinen van afbeeldingen is iets waarvoor imagemagick ideaal geschikt is.
Ubuntu beschrijft het als volgt:

amedee@fangorn:~$ apt-cache show imagemagick
Package: imagemagick
Priority: optional
Section: graphics
Installed-Size: 348
Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: ImageMagick Packaging Team <pkg-gmagick-im-team@lists.alioth.debian.org>
Architecture: amd64
Version: 7:6.5.1.0-1.1ubuntu3
Depends: libbz2-1.0, libc6 (>= 2.3.4), libfreetype6 (>= 2.2.1), libgomp1 (>= 4.2.1),
 libice6 (>= 1:1.0.0), libjpeg62, liblcms1 (>= 1.15-1), libltdl7 (>= 2.2.6a), libmagickcore2,
 libmagickwand2, libsm6, libtiff4, libx11-6, libxext6, libxt6, zlib1g (>= 1:1.1.4)
Suggests: transfig, imagemagick-doc
Filename: pool/main/i/imagemagick/imagemagick_6.5.1.0-1.1ubuntu3_amd64.deb
Size: 95720
MD5sum: 87d33361ab2486f49c8ea077d8933eff
SHA1: b1a0da0347944a35984d40f7f85e94a52d576ae8
SHA256: 431d515a1b033b167f2517382e944ccdc60388bb326dd43adfc1f15a552a8a49
Description: image manipulation programs
 ImageMagick is a software suite to create, edit, and compose bitmap images.
 It can read, convert and write images in a variety of formats (over 100)
 including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript,
 SVG, and TIFF. Use ImageMagick to translate, flip, mirror, rotate, scale,
 shear and transform images, adjust image colors, apply various special
 effects, or draw text, lines, polygons, ellipses and Bézier curves.
 All manipulations can be achieved through shell commands as well as through
 an X11 graphical interface (display).
Homepage: http://www.imagemagick.org/
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Task: kubuntu-desktop, kubuntu-netbook, edubuntu-desktop-gnome, edubuntu-desktop-kde,
 xubuntu-desktop
Don't panic, imagemagick bestaat ook voor al jullie Windows en Apple pointyclickers, zie http://www.imagemagick.org/script/binary-releases.php voor de downloadpagina.

Het omzetten van een groot aantal afbeeldingen is poepsimpel. Je geeft gewoon een van de volgende commando's in de directory waarin de te verkleinen afbeeldingen staan:

mogrify -resize 40% *.jpg
mogrify -resize 800x600 *.jpg
mogrify -resize 800 *.jpg
mogrify -resize 800x600! *.jpg
Dit geeft volgende resultaten:
  1. Verklein alle afbeeldingen naar 40% van hun oorspronkelijke afmeting.
  2. Verklein alle afbeeldingen zodat die binnen 800x600 pixels passen, met behoud van de aspect ratio.
  3. Verklein alle afbeeldingen zodat de breedte 800 pixels is.
  4. Verklein alle afbeeldingen zodat de afmeting exact 800x600 pixels is, waarbij de aspect ratio verloren mag gaan.
mogrify past de afbeeldingen in-place aan, dus de originelen worden overschreven. De om te zetten afbeeldingen zet je dus best op voorhand in een aparte directory, ofwel gebruik je convert ipv mogrify zodat je een nieuwe bestandsnaam kan (moet) meegeven.

Snelheidstest

Ik ben ervan overtuigd dat imagemagick véél efficiënter is dan al die GUI-programma's (met uitzondering misschien van lichtgewicht Irfanview). Daarom daag ik alle Windowsers en Appelaars uit voor een snelheidstest.

Ik heb 100 jpg-afbeeldingen gemaakt, allemaal bestaande uit willekeurige ruis. Je kan hier een kleiner voorbeeld (100x100) downloaden, of je kan ze ook zelf aanmaken met mijn bash scriptje img-create:

#!/bin/bash
for (( COUNTER=1; COUNTER<=100; COUNTER++ )) do
        convert -size 3000x3000 xc: +noise Random noise-"$COUNTER".jpg
        ls -hl noise-"$COUNTER".jpg
done
exit
Het aanmaken van de afbeeldingen duurde 11'3":
amedee@fangorn:/tmp$ time ./img-create
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-1.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-2.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-3.jpg
...
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-98.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-99.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-100.jpg

real    11m3.026s
user    10m44.710s
sys     0m13.570s
Met het bash scriptje img-resize zet ik ze om naar een kleiner bestand:
#!/bin/bash
for filename in `ls noise*.jpg`; do
        convert $filename -resize 50% small-"$filename"
        ls -hl *"$filename"
done
exit
De omzetting duurde slechts 2'46":
amedee@fangorn:/tmp$ time ./img-resize
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-100.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-100.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-10.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-10.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-11.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-11.jpg
...
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-98.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:30 small-noise-98.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-99.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:31 small-noise-99.jpg
-rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-9.jpg
-rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:31 small-noise-9.jpg

real    2m46.400s
user    3m37.430s
sys     0m10.530s
Wie doet het beter? Zet jouw resultaten in de reacties. Ik vraag me trouwens af hoe je op een betrouwbare manier de snelheid van Lightroom of Photoshop kunt meten, zonder gebruik te maken van een cronometer.

Externe harde schijf van FAT32 naar ext3

Ik heb een externe harde schijf van Iomega, zo'n klein plat ding in metalliek grijs. 320GB (of 298GiB) in binnenzakformaat. Ik gebruik die momenteel om backups op te zetten, en mijn downloads (zoals Ubuntu ISO's) staan daar ook op.

Standaard komt zo'n ding in FAT32 partitionering. Op zich is dat niet zo slecht, want dan zijn die schijfjes te gebruiken op zowel Linux, Windows als Mac (vermoed ik toch, ik ken niets van Mac). Alleen ben ik onlangs op een vervelende beperking gestoten. Ik had een backup gemaakt van een usb-stick van 8GB, en zelfs gecomprimeerd met bz2 was dat nog altijd rond de 6GB. Dat is dus een probleem voor FAT32, want die kan geen bestanden aan groter dan 2GB (4GB met 64KB clusters, maar dat wordt niet algemeen ondersteund).

Ik keek dus uit naar een ander filesystem om grotere bestanden te kunnen gebruiken. Mijn vereisten:

  • Ondersteuning voor grote bestanden (>4GB)
  • Read/write ondersteuning in zowel Linux als Windows, voor die enkele keren dat ik de harde schijf aansluit op een Windows-pc. Dat moet niet per sé native maar het moet wel gemakkelijk te installeren zijn.
  • Crashbestendig: voor wanneer ik zo lomp ben om de usb-kabel uit te trekken voor alle gegevens goed en wel op schijf staan. Dus liefst een soort journalling filesystem, zodat ik geen half uur moet wachten op een schijfcontrole.

Als ik de mogelijke kandidaten overloop, dan geeft mij dat het volgende resultaat:

filesystem bestanden >4GB R/W Linux R/W Windows journal
FAT32 nee ja ja nee
NTFS ja NTFS-3G ja ja
ext2 ja ja coLinux, Ext2fsd, Ext2IFS nee
ext3 ja ja coLinux, Ext2fsd, Ext2IFS ja
ext4 ja ja coLinux ja
XFS ja ja coLinux ja
Reiser ja ja coLinux ja

Ik ga de harde schijf in hoofdzaak met Linux gebruiken, dus NTFS lijkt me dan minder geschikt. coLinux, dwz het draaien van een Linux kernel onder Windows, klinkt als een interessant idee. Maar in een artikel op PolishLinux las ik daarover het volgende:

In short, we install coLinux on a windows machine, assure access to disk partions, and export all the mounted file systems using Samba.

Okeee... dus een volledige Linuxkernel, én ook nog eens Samba? Nee dank u, dat klinkt me een beetje als overkill in de oren. Ik zoek iets dat ik snel kan installeren op een machine die ik toevallig bezoek. Er staat dan ook niet voor niets op het einde van de pagina:

This solution does not provide an outstanding performance

Dan blijft er eigenlijk alleen nog ext3 over, met een van de filesystem drivers Ext2fsd of Ext2IFS. In het verleden heb ik altijd Ext2IFS gebruikt voor zo'n situaties, maar de recentste versie is van 27/10/2008, en ik heb niet de indruk dat er nog verder aan ontwikkeld wordt. Het is ook geen Free Software (free as in speech) maar Freeware (free as in beer). Met andere woorden het is verboden om Ext2IFS aan te passen of te verbeteren...
Ext2fsd daarentegen lijkt me nog een actief project: versie 0.48 is van 1 augustus 2009, én het is wel Free Software.
Nog een verschil tussen Ext2IFS en Ext2fsd: Ext2IFS gaat ext3 partities mounten als ext2, dus zonder journal. Ext2fsd kijkt wel naar het ext3 journal. In principe kan een ext4 partitie ook gemount worden als die aangemaakt is zonder extents, maar wat is dan nog het voordeel van een ext4 partitie als je geen extents hebt? Dan kan je beter ext3 pakken...

Mijn keuze valt dus op Ext2fsd. Daarna volgde het concrete inrichten van de harde schijf. Er stond al voor 160GB aan data op dus ik ben als volgt te werk gegaan:

  1. Grote bestanden wissen zodat ik ruim onder de 150GB zat. Vooral iso's van Linux distro's kwamen in aanmerking, want die kan ik gemakkelijk opnieuw downloaden.
  2. Met gparted de eerste (en enige) partitie verkleinen naar 160GB.
  3. Een nieuwe ext3 partitie van 160GB maken.
  4. De twee partities mounten en van de FAT32-partitie naar de ext3-partitie kopiëren met
    sudo mkdir /mnt/fat
    sudo mkdir /mnt/ext
    sudo mount /dev/sdg1 /mnt/fat
    sudo mount /dev/sdg2 /mnt/ext
    sudo rsync -av /mnt/fat/ /mnt/ext/
    sudo chown -R amedee:amedee /mnt/ext           # alle bestanden hadden root als owner
    chmod -R 664 /mnt/ext                          # alle bestanden hadden de executable bit op FAT32
    find /mnt/ext/ -type d -exec chmod a+x {} \;   # alle directories executable bit geven zodat browsing mogelijk is.
    sudo umount /mnt/fat
    sudo umount /mnt/ext
  5. Met gparted de FAT32-partitie formatteren. Die moet eerst leeg gemaakt worden, anders lukt het verkleinen niet.
  6. De FAT32-partitie verkleinen naar de kleinst mogelijke grootte. Gparted maakt daar automatisch 94,10MiB van, en FAT32 wordt omgezet naar FAT16.
  7. De ext3 partitie vergroten zodat die de volledige vrije ruimte gebruikt (298GiB).
  8. Ext2Fsd downloaden en op de FAT-partitie zetten. Zo moet ik niet meer doen in Windows dan Ext2Fsd-0.48.exe (997,4KB) installeren.

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?