dimanche, juillet 25, 2010

make installworld: «touch: not found» lors d'une mise à jour à distance

FreeBSD 8.1-Release étant de sortie, j'en ai profité pour mettre à jour mon kimsufi 250G.
Si la procédure de mise à jour à distance est en général assez risquée pour un changement de version majeure, elle ne ma jamais posée de problème pour un changement de version mineure.
Sauf que cette fois-ci, le «make installworld» se termine mal par le message d'erreur «touch: not found».

La FAQ officielle explique que ce problème est lié un problème d'horloge qui fait que les dates des fichiers à installer sont incorrect suite au redémarrage en mode «single user». La FAQ conseil d'utiliser la  commande «adjkerntz -i» pour résoudre ce problème. Cette proposition n'est pas adaptée à mon cas car je ne redémarre pas en mode single user.
    Un autre utilisateur, barryp, indique que ce problème est du au fichier /usr/src/sys/conf/newvers.sh qui n'a pas la bonne date et qu'un simple «touch» sur ce fichier pour le mettre à la bonne date résous le problème… Pas chance, cela ne résous pas mon problème :-(
     
    La bonne réponse m'a été donné sur le site de so14k: Il faut utiliser la commande «make installworld PATH=$PATH» pour ne plus avoir ce problème de «touch: not found».

    lundi, juillet 12, 2010

    Installation de FreeBSD «headless» (utilisation du port console comme clavier/écran)

    Je souhaitai installer FreeBSD sur une «vieille» unité centrale qui n'avait plus d'écran: Il me fallait utiliser le port série comme console principale.
    Ce n'est pas très compliqué: Il suffit de modifier l'image ISO de FreeBSD pour forcer l'usage du port série.
    Une fois téléchargé l'image, on la monte (l'ensemble des exemples utilisent tcsh comme shell):

    set MD=`mdconfig -a -t vnode -f FreeBSD-8.1-RC2-amd64-disc1.iso`
    mount -t cd9660 /dev/$MD /mnt/

    Vous obtenez une image montée en lecture seule (normal pour un ISO)… Ne reste plus qu'à la modifier et re-générer un fichier ISO.
    Pour cela, on peux vous conseiller de recopier l'intégralité de l'image disque et ensuite de modifier votre copie comme ceci:

    mkdir /tmp/isotmp
    cd /mnt
    tar cf - * | ( cd /tmp/isotmp; tar xfp - )

    Mais comme cette méthode est lente et consomme de la place sur votre disque, voici une méthode plus intelligente utilisant unionfs:

    mkdir /tmp/isotmp
    mount -t unionfs -o noatime /tmp/isotmp/ /mnt/

    Désormais le point de montage original (/mnt) est accessible en écriture :-)
    Modifions le boot/loader.conf pour forcer l'usage du port série:
    J'utilise une vitesse de 38400 baud pour que ca ne soit pas trop désagréable.
    Attention à l'utilisation de unionfs qui ne gère pas la fusion du contenus de deux fichiers identiques, il faut utiliser une copie pour ne pas écraser l'ancien:

    cat /mnt/boot/loader.conf > /mnt/boot/loader.conf.new
    echo 'comconsole_speed="38400"' >> /mnt/boot/loader.conf.new
    echo 'console="comconsole"' >> /mnt/boot/loader.conf.new
    echo 'boot_serial="-h"' >> /mnt/boot/loader.conf.new
    mv /mnt/boot/loader.conf.new /mnt/boot/loader.conf

    Ne reste plus qu'a régénérer une ISO:

    cd /mnt
    mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/FreeBSD-8.1-headless-.iso .

    Puis à démonter (2 fois) votre image, détruire le md et effacer votre dossier temporaire:

    cd /
    umount /mnt
    umount /mnt
    mdconfig -d -u $MD
    rm -rf /tmp/isotmp

    Mais ne partez pas si vite ! Il reste juste un tout petit détail qui a son importance…
    Une fois l'installation de FreeBSD terminé, et avant de re-démarrer:

    N'oubliez pas de modifier le /etc/ttys en lui déclarant l'usage du port série!
    Dans sysinstall: configure system ttys.
    Il va ouvrir le fichier /etc/ttys dans un éditeur de texte, il faut remplacer la ligne suivante:

    # Serial terminals
    # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    ttyu0   "/usr/libexec/getty std.9600"   dialup  off secure

    Par ceci:

    # Serial terminals
    # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    ttyu0   "/usr/libexec/getty std.38400"   vt100  on secure

    Personnellement, avant de graver le CD, je vérifie la procédure par l'excellentissime[1] qemu:

    qemu-img create fbsd-test.img 4G
    kldload kqemu.ko
    kldload aio.ko
    qemu-system-x86_64 -kernel-kqemu -nographic -cdrom FreeBSD-8.1-headless.iso -hda fbsd-test.img -boot d
    qemu-system-x86_64 -kernel-kqemu -nographic -hda fbsd-test.img

    Article original m'ayant fortement inspiré: FreeBSD Headless install
    [1] Essayez d'en faire autant en si peux de lignes de commande avec VirtualBox !

    vendredi, juillet 09, 2010

    Utilisation de nanoBSD sur un WRAP de PC-Engines

    Après avoir passé 2 jours à chercher pourquoi BSDRP (NanoBSD basé sur FreeBSD 8.1-RC2) ne voulais pas démarrer sur mon PC-Engines WRAP.1E-2, voici la liste des pré-requis à respecter…

    Coté WRAP:
    1. Version du BIOS en 1.11
    2. BIOS configuré en mode CHS (et non pas LBA)
    Coté NanoBSD:
      1. Compiler un noyaux i386 avec la ligne "options CPU_GEODE" dans le fichier de configuration
      2. L'image nanoBSD doit utiliser comme console le port série par défaut (cust_comconsole) à la vitesse de 38400 baud si possible (pour respecter la vitesse par défaut du WRAP).
      3. L'image nanoBSD doit absolument utiliser une géométrie disque de 255H 63S/T. Par exemple en utilisant «UsbDevice generic-hdd 256» pour une image finale de 256Mo.
      4. Le bootloader doit être paramétré en mode nopacket, car le mode «packet» par défaut n'est pas compatible avec le BIOS du WRAP

        Si votre séquence de démarrage reste bloqué à l'affichage de nombreux «###» comme ceci:

        PC Engines WRAP.1C/1D/1E v1.11
        640 KB Base Memory
        130048 KB Extended Memory

        01F0 Master 848A SanDisk SDCFB-512                      
        Phys C/H/S 993/16/63 Log C/H/S 993/16/63

        1  FreeBSD
        2  FreeBSD
         
        F6 PXE
        Boot:  1 #############################################################################################################

        Re-vérifiez les point 3 et 4 de vos images nanoBSD.
        Par exemple, une fois la carte flash insérée dans le lecteur CF de votre poste de travail (sous FreeBSD), utilisez la commande «boot0cfg -v /dev/device» pour vérifier le mode:




        [root@d630]#boot0cfg -v /dev/da1
        #   flag     start chs   type       end chs       offset         size
        1   0x80      0:  1: 1   0xa5    111: 63:32           32       229344
        2   0x00    112:  1: 1   0xa5    223: 63:32       229408       229344
        3   0x00    224:  0: 1   0xa5    233: 63:32       458752        20480
        4   0x00    234:  0: 1   0xa5    243: 63:32       479232        20480

        version=2.0  drive=0x80  mask=0x3  ticks=182  bell=# (0x23)
        options=nopacket,update,nosetdrv
        volume serial ID 9090-9090
        default_selection=F1 (Slice 1)

        Puis vérifier que la géométrie de votre image :

        [root@d630]#fdisk /dev/da1
        ******* Working on device /dev/da1 *******
        parameters extracted from in-core disklabel are:
        cylinders=62 heads=255 sectors/track=63 (16065 blks/cyl)

        parameters to be used for BIOS calculations are:
        cylinders=62 heads=255 sectors/track=63 (16065 blks/cyl)

        (etc…)