Chargement...
 
Skip to main content

Historique: Créer un système Live USB personnalisé

Aperçu de cette version: 32



NB : cet article sera peut être supprimé, il est ici comme carnet de notes sur un projet qui m'a pris un peu de temps.


Objectif

Présentation

Image
L'objectif de cet article est de relater l'installation d'un système GNU/Linux sur une clé USB. Cette dernière permet de démarrer un ordinateur d'architecture i386 et de faire tourner un certain nombre d'applications. Il s'agit donc de faire tourner une distribution musicale sur une clé USB de 4 Go!
L'intérêt est de disposer d'une clé à la manière d'un Live CD, permettant de se connecter sur un PC pour y réaliser des opérations musicales nomades.

Etat de l'art

L'idée est de disposer d'1 à 4 Go et de n'y installer que le strict nécessaire pour pouvoir disposer de quelques logiciels sur mesure.
Il existe des distributions minilunix pour clé de 64Mo, Il existe des documentations permettant de faire des distributions à base de système Knoppix. Mais l'idée est de faire ici une clé sur mesure.
Après avoir fait des essais avec un système Gentoo, j'ai renoncé pensant que le poids des compilateurs était un frein à l'économie de mémoire.
Le choix s'est donc porté sur une Debian.

Installation


Description


Etape 1


La première étape est de charger sur le site de débian une image ISO minimale appelée business card. Cette image tient sur 40Mo et elle permet de graver un CDROM. Cette installation nécessite un accès réseau. L'installeur a trouvé une adresse IP car j'avais un serveur DHCP sous la main.

Le CDROM est booté sur un vieux PC qui sait quand même démarrer sur une clé USB.

Attention : au démarrage certains PC ne reconnaissent la CLE USB au moment de l'installation que si le PC est physiquement allumé quand la clé est dedans. Un simple reboot peut perdre la clé.


au besoin passer l'option

linux26 vga=771



Etape 2


Installer le CD Debian carte de crédit le plus à jour et demander l'installation sur votre clé USB.

J'ai choisi d'installer Linux sur la clé complète, c'est à dire que j'ai laissé la Debian faire deux partitions sur la clé USB : une de swap et une grande partition ext3. La partition de swap si elle s'avère inutile pourra être remplacée par une partition VFAT par la suite permettant d'utiliser la clé USB comme une clé 64Mo.

Durant l'installation il est utile de surveiller par les touches CONTROL ALF F2 en ouvrant une console et par une commande df que la partition tient la charge en terme de quantité d'espace disque.
CONTROL F1 permet de revenir à l'écran d'installation et CONTROL F3 permet de suivre ce qu'il se passe. C'est important de suivre car sur certains PC l'USB 2.0 plante au niveau du BIOS. Dans ce cas ne pas hésiter à flasher une version plus récente du BIOS.

Etape 3 : Création initramfs


Par défaut, votre clé USB bootera mais fera un "kernel panic" en disant qu'elle ne trouve pas le "ROOT device". La raison en est simple. Sous Linux, les périphériques USB de type stockage (Mass Storage) sont reconnu en tant que périphériques SCSI.

Pour chager ces modules au démarrage nous devons créer un nouvel "initramfs" . La méthode la plus simple pour effectuer l'opération est d'utiliser l'outil "mkinitramfs" (8) fourni par debian.

Liste des modules




Pour que notre clé USB soit reconnue après le boot du noyau, nous devons charger des modules. Ceux-ci sont a spécifier dans /etc/mkinitrd/modules de votre clé USB


mount -o bind /proc /mnt/flash/proc
mount /dev/sdb1 /mnt/flash
chroot /mnt/flash/ /bin/bash -l


Il faut ajouter les deux lignes suivantes dans le fichier /etc/mkinitramfs/modules de votre clé:
ide-cd
cdrom
ide_generic
ide_core
ide-disk
ide-generic
scsi_mod
sd_mod
psmouse
usbcore
ehci-hcd
uhci-hcd
ohci-hcd
usbmouse
usb-storage


Ces deux modules doivent être présents dans votre noyau (ce qui est le cas pour les noyaux debian par défaut).

Configuration de mkinitramfs


L'outil mkinitrd vient avec un fichier de configuration. Celui-ci est dans /etc/mkinitrd/mkinitrd.conf (5). Nous devons y changer deux lignes comme indiqué ci-dessous

MODULES=dep
ROOT=/dev/sda1
DELAY=5


MODULES=dep : Lors de la création du initrd, uniquement les modules spécifiés seront ajoutés ainsi que les dépendances nécessaires.
DELAY=10 : Lors de l'initialisation de certain périphériques (Scsis, Usb ...) il peut etre parfois nécessaire d'attendre quelques secondes. Cela est pariculièrement interessant quand il s'agit du device ROOT.


Création de l'image


Pour créer votre image, il suffit d'appeler mkinitrd avec les bons paramètres.
mkinitramfs -o /boot/myinitrd-2.6.18-5-686 2.6.18-5-686

La valeur 2.6.18-5-686 correspond a la version complète de notre noyau ainsi qu'au répertoire contenant les modules (/lib/modules/<version>/)


N'oubliez pas d'adapter grub pour prendre en compte le nouvel initrd en question.

En ajustant dans votre fichier /boot/grub/menu.lst les lignes du genre


  1. le titre
title Debian GNU/Linux, kernel 2.6.8-2-386
  1. dire de booter sur le premier device qui est votre clé en principe puisque vous booter dessus
root (hd0,0)
kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro vga=771
initrd /boot/myinitrd


On note qu'au moment du boot la clé est vue comme le premier disque sda même si votre disque dur est un disque SCSI

le fichier /etc/fstab sera


proc /proc proc defaults 0 0
/dev/sdb1 / ext3 defaults,errors=remount-ro 0 1
/dev/sdb5 none swap sw 0 0


En effet à ce moment là du process votre disque dur est vu comme /dev/sda





Premiers tests


En spécifiant dans votre BIOS que vous souhaitez booter sur la clé USB vous devriez maintenant pouvoir booter sur la clé USB sans problème.

A la première installation le système Linux minimal vous demandera les mots de passe root et les heures ainsi que des informations de configuration et chargera à l'aide de l'utilitaire aptitude les packages debian à jour.

Ce système vous permet d'utiliser Linux sur une centaine de Mega mais vous n'avez pas à ce stade là d'interface graphique.
La suite des opérations va viser à installer X11

Customisation de la clé


Travail préparatoire



Explications


Quelques modifications sont nécessaires pour installer votre système Linux mais :

  • en général votre controleur USB est configuré sans aucune optimisation avec des traces de débug qui ralentissent le processus, il va falloir recompiler le noyau

  • il va falloir installer X11 et le reste.

La méthode retenue consiste à prendre un PC avec un disque d'accès rapide, de copier la clé dessus de tout installer sur cette portion de disque et une fois que tout sera installé (ou de temps en temps) recopier le contenu du disque sur la clé pour la tester.

L'important c'est qu'à présent votre clé est capable de booter.

Mise à disposition d'un espace de travail rapide


Les commandes suivantes copies le contenu la clé sur votre partition disque /mnt/flash

mount -o ro /dev/sda1 /mnt/usb/
cd /mnt/usb
mkdir /mnt/flash
cp -pdr ./* /mn/flash/
mount -o bind /proc /mnt/flash/proc
chroot /mnt/flash/ /bin/bash -l


Vous êtes maintenant sur la parition /mnt/flash avec votre shell bash comme si vous étiez sur /

Vous avez une machine virtuelle sur votre disque dur et pouvez continuer l'installation

On va dire à Debian d'installer xfce4 ce qui provoquera l'installation de X et de tous les outils nécessaires

apt-get install xfce4


Mise à jour de la clé après l'installation rapide


exit
umount /mnt/flash/proc
cd /mnt/flash
umount /mnt/usb
mount /dev/sda1 /mnt/usb/
cp -pdr /mnt/flash/* /mnt/usb/



Version 2


Voici le script de génération de la clé de base



#!/usr/bin/perl
# Génération d'une clé USB roue de secours
# Version 1.0
# Variables globales à paramétrer


$USBDEVICE="/dev/sdb" ; # device de la clé
$USBPART="${USBDEVICE}1" ; # partition de boot ( bootable en ext3)
$USBSWAP="${USBDEVICE}2"; # Partition de swap
$MNTPOINT="/mnt/flash" ; # endroit ou l'on souhaite monter la clé pour la préparation
$KERNELRELEASE="2.6.22.6" ; # nom du noyau qui doit se trouver dans /boot ainsi que des modules dans /lib
$BUSYBOX="busybox-1.7.1"; # téléchargé dans sa dernière version faire make xconfig puis make

# procedures

#Execution d'une commande
sub Exec {
my $command = shift;
print "$command\n";
`$command`;
}

#Annonce de la commande envoyée à la console
sub Annonce {
my $ligne= shift;
print "=> $ligne :\n";
}

# CopyRecur est capable de copier /usr/bin/perl dans $MNTPOINT/usr/bin/perl en créant $MNTPOINT/usr puis bin et en copiant le fichier dans le répertoire ainsi créé
sub CopyRecur
{
my $command = shift;
my @rep=split('/',$command);
shift (@rep);
my $c=pop (@rep);
chdir $MNTPOINT ;
foreach $r (@rep) {
mkdir ($r);
chdir ($r);
}
Exec ("cp $command .");
}

# CopieCommand est capable de copier une commande dans le point de montage en suivant les répertoires et également de déterminer les librairies nécessaires et les copier récursivement
sub CopieCommand {
my $command = shift;
Annonce "Copie de la commande $command";
CopyRecur ($command);
my $result=`ldd $command`;
my @result=split("\n" ,$result);
foreach my $line (@result)
{
$line=~s/\(.*//g;
$line=~s/=>/(/;
($lib1,$lib2,$add)=split(/\(/,$line);
$lib2=~s/ //g;
if ( $lib2 ne "" ) { Annonce "Copie de la librairie .$lib2."; CopyRecur($lib2) ; }
}
}

sub CopieLibrairie {
my $lib=shift;
CopieCommand ($lib);
}

$WORKDIR=`pwd`;
chomp($WORDIR);
chomp ($WORKDIR);
mkdir $MNTPOINT ;
Annonce "Génération d'un file system ext3 sur $USBPART";
Exec ("mkfs.ext3 $USBPART");
Exec ("mount $USBPART $MNTPOINT");

Annonce ("Fabrication des répertoires racines");
chdir ($MNTPOINT) ;
mkdir (boot);
mkdir (bin);
mkdir (lib);
mkdir (data);
mkdir (dev);
mkdir (tmp);
mkdir (var);
mkdir (etc);
mkdir ("etc/init.d");
mkdir (usr);
mkdir ("usr/bin");
mkdir ("var/log");
mkdir ("var/lock");-
mkdir ("dev");
chdir ("dev");
Exec ("/dev/MAKEDEV generic console");
chdir ($MNTPOINT);

Annonce ("Fabrication des fichiers spéciaux");
Exec ("mkdir -pv $MNTPOINT/proc");
Exec ("mkdir -pv $MNTPOINT/sys");
Exec ("mkswap -v $USBSWAP");

Annonce ("Installation des modules");
mkdir ("lib/modules");
mkdir ("lib/modules/$KERNELRELEASE");
Exec ("cp -r /lib/modules/$KERNELRELEASE $MNTPOINT/lib/modules/$KERNELRELEASE");

Annonce ("Installation du noyau");
chdir ("/boot") ;
Exec ("cp vmlinuz-$KERNELRELEASE $MNTPOINT/boot");
Exec ("cp System.map-$KERNELRELEASE $MNTPOINT/boot");

Annonce ("Installation de busybox");
chdir ("$WORKDIR");
Exec ("cp -ra $BUSYBOX/_install/* $MNTPOINT");
Exec ("chown -R root:root $MNTPOINT");

Annonce ("Copie des librairies");
CopieLibrairie ("/lib/ld-linux.so.2");
CopieLibrairie ("/lib/tls/i686/cmov/libc.so.6");
CopieLibrairie ("/lib/libcrypt.so.1");

Annonce ("Installation des inits");
open (INITTAB,">$MNTPOINT/etc/inittab");
print INITTAB "::sysinit:/etc/init.d/rcS\n";
print INITTAB "::askfirst:/bin/sh\n";
print INITTAB "::restart:/sbin/init\n";
print INITTAB "::ctrlaltdel:/sbin/reboot\n";
print INITTAB "::shutdown:/sbin/reboot\n";
close (INITTAB);

Annonce ("Installation passwd et group");
open (PASS,">$MNTPOINT/etc/passwd");
print PASS "root::0:0:root:/media:/bin/sh\n";
close (PASS);
open (GRP,">$MNTPOINT/etc/group");
print GRP "root::0\n";
close (GRP);

open(RCS,">$MNTPOINT/etc/init.d/rcS\n");
print RCS "#!/bin/sh\n";
print RCS "/sbin/splashy boot\n";
print RCS "mount -t proc none /proc\n";
print RCS "mount -t sysfs none /sys\n";
print RCS "mount -o remount,rw\n";
print RCS "mount -a\n";
print RCS "loadkmap < /etc/french.kmap\n";
close (RCS);
Exec ("chmod +x $MNTPOINT/etc/init.d/rcS");

chdir ("/");
Annonce "Installation du Grub";
Exec ("grub-install --root-directory=$MNTPOINT $USBDEVICE");
Annonce "Fabrication du menu de grub";
open (GRUB,">$MNTPOINT/boot/grub/menu.lst");
print GRUB "default\n";
print GRUB "timeout 15\n";
print GRUB "color cyan/blue white/blue\n\n";
print GRUB "title Roue de secours\n";
print GRUB "root (hd0,0)\n";
print GRUB "kernel /boot/vmlinuz-$KERNELRELEASE root=/dev/uba1 rw init=/bin/sh\n";
print GRUB "quiet\n";
print GRUB "title Roue de secours 2\n";
print GRUB "root (hd0,0)\n";
print GRUB "kernel /boot/vmlinuz-$KERNELRELEASE root=/dev/uba1 rw splash vga=791\n";
print GRUB "quiet\n";
close (GRUB);

Annonce ("Fabrication du splash");
Exec ("cp /sbin/splashy $MNTPOINT/sbin/splashy");
mkdir ("$MNTPOINT/etc/splashy");
Exec ("cp /etc/splashy/config.xml $MNTPOINT/etc/splashy");
mkdir ("$MNTPOINT/etc/splashy/themes/");
mkdir ("$MNTPOINT/etc/splashy/themes/rouesecours");
Exec ("cp /etc/splashy/themes/rouesecours/boot0.png $MNTPOINT/etc/splashy/themes/rouesecours");
Exec ("cp /etc/splashy/themes/roursecours/theme.xml $MNTPOINT/etc/splashy/themes/rouesecours");

Annonce ("Clavier français");
chdir ("$MNTPOINT");
Exec ("./bin/dumpkmap > etc/french.kmap");

Exec ("umount $MNTPOINT");
Exec ("umount $MNTPOINT");







Historique

Avancé
Information Version
Fri 06 Nov 2015 14:25 olinuxx Recherche et remplacement en masse 48
Afficher
Fri 05 Sep 2014 16:30 olinuxx Recherche et remplacement en masse 47
Afficher
Mon 04 Nov 2013 17:11 anonymous wiki_up conversion 46
Afficher
Wed 27 Feb 2013 22:31 utilisateur_anonyme2 45
Afficher
Sat 09 Jun 2012 17:11 pianolivier mise en page 44
Afficher
Sat 09 Jun 2012 17:10 pianolivier mise en page 43
Afficher
Sat 09 Jun 2012 17:09 pianolivier mise en page 42
Afficher
Sat 19 mai 2012 19:54 pianolivier renommage de la page +alias(cleusb) 41
Afficher
Mon 09 Apr 2012 16:58 pianolivier +BOX 40
Afficher
Fri 23 Oct 2009 18:52 olinuxx (mode stylo rouge sur moi même) 39
Afficher
Fri 23 Oct 2009 18:50 olinuxx ajout forum Mustick 38
Afficher
Fri 23 Oct 2009 18:48 olinuxx avant propos 37
Afficher
Fri 23 Oct 2009 18:46 olinuxx info de départ 36
Afficher
Fri 23 Oct 2009 18:45 olinuxx script retractable 35
Afficher
Fri 23 Oct 2009 18:40 olinuxx mise en page + mode stylo rouge 34
Afficher
Fri 23 Oct 2009 18:38 olinuxx mise en page + (mode stylo rouge) + liens internes + visuel 33
Afficher
Fri 23 Oct 2009 18:33 olinuxx mise en page 32
Afficher
Fri 23 Oct 2009 18:32 olinuxx mise en page 31
Afficher
Fri 23 Oct 2009 18:31 olinuxx taille image 30
Afficher
Fri 23 Oct 2009 18:31 olinuxx taille image 29
Afficher
Tue 17 Jun 2008 19:55 Makak_du_27 28
Afficher
Tue 17 Jun 2008 19:53 Makak_du_27 27
Afficher
Tue 17 Jun 2008 19:52 Makak_du_27 26
Afficher
Tue 17 Jun 2008 19:51 Makak_du_27 25
Afficher
Tue 17 Jun 2008 19:48 Makak_du_27 24
Afficher
Tue 17 Jun 2008 19:47 Makak_du_27 23
Afficher
Sun 27 Jan 2008 12:32 gilles 22
Afficher
Sun 27 Jan 2008 12:31 gilles 21
Afficher
Sun 27 Jan 2008 12:29 gilles 20
Afficher
Sun 09 Sep 2007 22:43 gilles 19
Afficher
Sun 09 Sep 2007 19:37 gilles 18
Afficher
Sun 12 Mar 2006 21:19 gilles 17
Afficher
Sun 12 Mar 2006 21:14 gilles 16
Afficher
Fri 10 Mar 2006 11:24 bobcatt 15
Afficher
Wed 08 Mar 2006 17:55 gilles 14
Afficher
Thu 02 Mar 2006 17:22 gilles 13
Afficher
Tue 28 Feb 2006 16:10 gilles 12
Afficher
Tue 28 Feb 2006 16:00 gilles 11
Afficher
Tue 28 Feb 2006 15:55 gilles 10
Afficher
Tue 28 Feb 2006 12:50 bobcatt 9
Afficher
Mon 27 Feb 2006 19:12 gilles 8
Afficher
Mon 27 Feb 2006 19:06 gilles 7
Afficher
Mon 27 Feb 2006 18:45 gilles 6
Afficher
Mon 27 Feb 2006 18:44 gilles 5
Afficher
Mon 27 Feb 2006 18:43 gilles 4
Afficher
Mon 27 Feb 2006 18:35 gilles 3
Afficher
Mon 27 Feb 2006 18:33 gilles 2
Afficher
Mon 27 Feb 2006 18:33 gilles 1
Afficher