Debian etch - Clé USB

Posté le Saturday, 04 August 2007 in SysAdmin

Il peut être parfois utile de se déplacer ici et là avec une distribution Linux clé en main sans se trimbaler toujours avec un ordinateur portable ou un CD.

La clé USB devient alors très utile atteignant aujourd'hui des tailles de l'ordre de 2G pour pas trop cher1. De petite taille, elle peut être utilisée dans des endroits ayant des ordinateurs avec un système d'exploitation propriétaire (ou un autre système libre, ou même pas sans système) mais permettant de démarrer sur un périphérique externe (une clé USB par exemple).

L'utilité peut-être variable :

  • Surfer avec une plus grande tranquillité
  • Utiliser ses logiciels favoris ( Amarok, KMyMoney, KDevelop, ... )
  • Utiliser une interface graphique, bien sûr, meilleure.
  • Utiliser dans un système embarqué.
  • Tester les ordinateurs portables dans les magasins

J'ai trouvé différents sites, tel que Ubuntu en mode persistant permettant d'installer une distribution Ubuntu sur une clé USB ou un disque dur USB.L'inconvénient de cette méthode est qu'il n'est pas possible d'installer uniquement ce que l'on souhaite partant obligatoirement d'une base LiveCD.

Ensuite j'ai trouvé d'autres sites, tels que Howto Install a Debian GNU/Linux system onto a USB flash thumb drive et Installing Debian onto USB flash media with everything encrypted. dont je me suis inspiré pour écrire ce tutoriel.

Préparation de la clé

Modules

Afin de pouvoir accéder à la clé USB, il faut bien évidemment avoir chargé sur sa machine Gnu/Linux les modules adéquates :

# modprobe ehci_hcd
# modprobe ohci_hcd
# modprobe usbhid
# modprobe usb_storage

Logiciels

Nous allons considérer que nous sommes sur un système à base de Gnu/Debian (Ubuntu devrait pouvoir faire l'affaire). Si vous avez un autre système, il vous faut trouver un moyen d'installer le programme debootstrap

Sur un système Gnu/Debian, il vous suffit de taper la commande, si le programme n'est pas déjà installé :

# aptitude install debootstrap

Installation du système de base

Partitionnement de la clé USB

En premier lieu il faut effectuer le partitionnement de la clé USB. Selon sa taille et aussi de la quantité de logiciel que vous voulez installer il faudra prévoir plus ou moins de place.

Pour le partitionnement vous pouvez utiliser votre utilitaire favori (parted, qtparted, fdisk, cfdisk, ...). Le partitionnement que j'ai effectué pour ma propre clé est le suivant :

  1. 50Mo pour la partition /boot
  2. 1,5Go pour la partition /
  3. le reste pour la partition /home

La partition /home a été séparée afin de pouvoir mettre la partie / de la clé USB en lecture seule (étape que je n'ai pas encore effectuée).

Disk /dev/usb/k2g: 2024 MB, 2024275968 bytes
63 heads, 62 sectors/track, 1012 cylinders
Units = cylinders of 3906 * 512 = 1999872 bytes

       Device Boot      Start         End      Blocks   Id  System
/dev/sda1                   1          26       50747   83  Linux
/dev/sda2                  27         827     1564353   83  Linux
/dev/sda3                 828        1012      361305   83  Linux

Une fois les partitions créées vous pouvez les formater pour les utiliser.

# mke2fs /dev/sda1 -L live-boot
# mke2fs /dev/sda2 -L live-root
# mke2fs /dev/sda3 -L live-home
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mkdir /mnt/home
# mount /dev/sda1 /mnt/boot
# mount /dev/sda3 /mnt/home

Installation à l'aide de debootstrap

Une fois les partitions montées on peut installer le système Gnu/Debian sur la clé USB en utilisant l'utilitaire debootstrap :

# debootstrap --arch i386 etch /mnt/ ftp://ftp2.fr.debian.org/debian/
I: Retrieving Release
I: Retrieving Packages
I: Validating Packages
I:  Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional base dependencies: libdb4.2 libgnutls12 libreadline5
   libsigc++-2.0-0c2a openbsd-inetd readline-common
I: Checking component main on http://ftp.debian.org/debian...
I: Retrieving adduser
...
I: Configuring gnupg...
I: Configuring sysklogd...
I: Configuring klogd...
I: Configuring netbase...
I: Configuring openbsd-inetd...
I: Base system installed successfully.

Dans un Chroot

Les opérations suivantes sont à faire sur l'environnement de destination, il faut donc utiliser la commande chroot pour s'y placer.

# chroot /mnt '/bin/bash -i'

Noyaux

Une fois le système de base installé, il faut le configurer et y ajouter de quoi démarrer la clé USB.

Ajustement et systèmes de fichiers : /etc/fstab

Cela dépend de votre configuration, et du partitionnement que vous avez fait. Si vous avez fait le même partitionnement que moi vous devriez avoir un fstab ressemblant à celui là :

#/etc/fstab: static file system informations.
#
LABEL=live-root    /           ext2    defaults,errors=remount-ro,noatime  0   1
LABEL=live-boot    /boot           ext2    defaults,noatime,ro         0   2
LABEL=live-home    /home           ext2    defaults,noatime            0   2
proc       /proc           proc    defaults                0   0
#tmpfs     /etc/network/run    tmpfs   defaults,noatime            0   0
tmpfs      /tmp            tmpfs   defaults,noatime            0   0
tmpfs      /var/lock       tmpfs   defaults,noatime            0   0
tmpfs      /var/log        tmpfs   defaults,noatime            0   0
tmpfs      /var/run        tmpfs   defaults,noatime            0   0
tmpfs      /var/tmp        tmpfs   defaults,noatime            0   0

J'utilise le label de la partition au lieu d'utiliser le block device. L'utilisation du block device peut gêner si la clé USB n'est pas toujours détectée dans le même ordre2.Les dossiers temporaires sont tous reportés dans un système de fichier virtuel (en mémoire) à l'aide de tmpfs.

Une fois le fichier /etc/fstab configuré, il ne reste plus qu'à monter les partitions. Pour monter les partitions un simple mount -a le fait. Il est aussi possible de monter les partitions une à une.

Il est possible que la commande suivante faite hors du chroot puisse résoudre certain problème si l'application utilise udev, ... :

mount --bind /dev/ /mnt/dev/
Le réseau : /etc/hostname /etc/hosts

Le fichier /etc/hosts doit contenir une ligne indiquant l'adresse du loopback et le nom de la machine. Ceci afin que KDE par exemple puisse démarrer :

127.0.0.1       localhost.localdomain   localhost  liveding

Dans le fichier /etc/hostname il faut également mettre le nom de la machine.

Apt : /etc/apt/sources.list

Le fichier sources.list contient les lignes par défaut suivantes :

# etch
deb ftp://ftp2.fr.debian.org/debian/ etch main contrib non-free
deb-src ftp://ftp2.fr.debian.org/debian/ etch main contrib
deb http://security.debian.org/ etch/updates main
deb-src http://security.debian.org/ etch/updates main

# etch unofficial
deb http://ftp.debian-unofficial.org/debian etch main contrib non-free restricted

Ces lignes permettent de télécharger les paquets par défaut de Gnu/Debian ainsi que les paquets de sécurité, et les paquets non officiels permettant d'activer certaine fonctionnalité.

Initrd : /etc/kernel-img.conf

Dans le fichier /etc/kernel-img.conf on enregistre les informations suivantes (afin que Gnu/Debian crée un fichier initrd lors de l'installation du noyau) :

# Kernel Image management overrides
# See kernel-img.conf(5) for details
do_symlinks = Yes
do_initrd = yes

Le fichier initrd permet de charger les modules nécessaires3 au démarrage de Gnu/Linux sur une clé USB.

Installation de paquet
# aptitude install initrd-tools linux-image-2.6.16-1-686
# aptitude install grub
# aptitude install localepurge
# aptitude clean# localepurge

On installe une image du noyau, ainsi que les outils pour générer l'image initrd. On installe également grub qui servira à démarrer sur la clé USB. Le paquet localepurge permet quant à lui de nettoyer les locales qui prennent un peu trop de place sur la clé USB. Généralement je ne conserve que les locales françaises et anglaises.

Il est aussi possible d'installer quelques paquets comme un serveur graphique, même voir KDE, ou encore des outils d'administration. On peut aussi installer des outils qui pourront permettre de réparer une machine.

Quelques ajustements.

Afin de ne pas écrire trop souvent sur la clé USB, on remplace quelques fichiers.

rm -f /etc/blkid.tab*
ln -s /dev/null /etc/blkid.tab
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab

Configuration de grub

Afin que la machine puisse démarrer il faut installer grub sur le secteur de démarrage de la clé USB.Pour cela, on peut quitter le chroot. Pour installer grub on peut utiliser grub-install :

# grub-install recheck root-directory=/mnt/ /dev/sda

Normalement cela devrait fonctionner ;) mais il est possible, si cela ne marche pas d'essayer de l'installer à l'aide de la commande grub directement (attention le hd1 est à adapter selon votre configuration) :

# grub
grub> root (hd1,0)
grub> setup (hd1)

Il faut également renseigner le fichier /mnt/boot/grub/menu.lst

# menu.lst - See: grub(8), info grub, update-grub(8)
#            grub-install(8), grub-floppy(8),
#            grub-md5-crypt, /usr/share/doc/grub
#            and /usr/share/doc/grub-doc/.

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default        0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout        5

# Pretty colours
color cyan/blue white/blue

## password '--md5' passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line)  and entries protected by the
# command 'lock'
# e.g. password topsecret
#      password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret

#
# examples
#
# title        Windows 95/98/NT/2000
# root     (hd0,0)
# makeactive
# chainloader  +1
#
# title        Linux
# root     (hd0,1)
# kernel   /vmlinuz root=/dev/hda2 ro
#

#
# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST

### BEGIN AUTOMAGIC KERNELS LIST
## lines between the AUTOMAGIC KERNELS LIST markers will be modified
## by the debian update-grub script except for the default options below

## DO NOT UNCOMMENT THEM, Just edit them to your needs

## ## Start Default Options ##
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
##      kopt_2_6_8=root=/dev/hdc1 ro
##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=LABEL=live-root rootdelay=5 ro quiet

## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,0)

## should update-grub create alternative automagic boot options
## e.g. alternative=true
##      alternative=false
# alternative=true

## should update-grub lock alternative automagic boot options
## e.g. lockalternative=true
##      lockalternative=false
# lockalternative=false

## additional options to use with the default boot option, but not with the
## alternatives
## e.g. defoptions=vga=791 resume=/dev/hda5
# defoptions=vga=791

## should update-grub lock old automagic boot options
## e.g. lockold=false
##      lockold=true
# lockold=false

## Xen hypervisor options to use with the default Xen boot option
# xenhopt=

## Xen Linux kernel options to use with the default Xen boot option
# xenkopt=console=tty0

## altoption boot targets option
## multiple altoptions lines are allowed
## e.g. altoptions=(extra menu suffix) extra boot options
##      altoptions=(single-user) single
# altoptions=(single-user mode) single

## controls how many kernels should be put into the menu.lst
## only counts the first occurence of a kernel, not the
## alternative kernel options
## e.g. howmany=all
##      howmany=7
# howmany=all

## should update-grub create memtest86 boot option
## e.g. memtest86=true
##      memtest86=false
# memtest86=true

## should update-grub adjust the value of the default booted system
## can be true or false
# updatedefaultentry=false

## ## End Default Options ##

title      Debian GNU/Linux, kernel 2.6.18-4-686
root       (hd0,0)
kernel     /vmlinuz-2.6.18-4-686 root=LABEL=live-root rootdelay=5 ro quiet vga=791
initrd     /initrd.img-2.6.18-4-686
savedefault

title      Debian GNU/Linux, kernel 2.6.18-4-686 (single-user mode)
root       (hd0,0)
kernel     /vmlinuz-2.6.18-4-686 root=LABEL=live-root rootdelay=5 ro quiet single
initrd     /initrd.img-2.6.18-4-686
savedefault

### END DEBIAN AUTOMAGIC KERNELS LIST

Ajout d'un utilisateur

Enfin il ne faut pas oublier d'installer un compte utilisateur4, ainsi que changer le mot de passe root à l'aide des commandes :

# chroot /mnt
# passwd
# adduser toto

Redémarrage et test

Il ne reste plus qu'à démonter toutes les partitions et redémarrer la machine.

# umount -a
# exit
# reboot

  1. J'ai par ailleurs acheté récemment une clé USB de 2Go à cet effet pour à peine 15 euros 

  2. Ce qui peut arriver quand on change de machine par exemple. 

  3. i.e les modules USB, ... 

  4. Il ne faudrait pas travailler en administrateur, hein ! 

Commentaires

1. Le 2007-08-05 14:11:32+02:00 par frenchbigdog

Super tuto, bien complet, je garde de côté pour tester lorsque l'occasion se présentera ;)

2. Le 2007-08-08 08:48:43+02:00 par jimbo

Salut

je suis ton tuto mais je ne sais pas si t'as eu cette erreur car chez moi en faisant le mount -a ou mount /dev/sdb1 j'ai l'erreur comme quoi /dev/sdb1 n'existe pas ??? or si je fais un fdisk -l il voit bien ma partition boot

tu as eu ce probleme ? c'est juste apres avoir créé le fstab.

3. Le 2007-08-08 09:21:13+02:00 par Diplodocus

Salut,

Il est possible qu'il ne trouve pas la partition dans /dev/ parce que /dev n'est pas monté.

Tu peux essayer (dans une autre console) de monter de /dev/ local dans ton environnement chroot :

mount --bind /dev/ /mnt/dev/

puis à la suite de cela réessayer de monter les partitions

4. Le 2007-08-20 14:44:37+02:00 par ppito

Salut même problème chez moi:

10:# mount -a
mount: special device LABEL=live-boot does not exist
mount: special device LABEL=live-home does not exist

J'ai ensuite mont mont /dev local dans le chroot comme tu l'explique.... aucun changement j'ai le même message d'erreur...

je cherche encore... mais si tu as une idée je suis prenneur....

Dans tous les cas: chouette tuto c'est vrai.... merci ;)

5. Le 2007-08-20 15:15:39+02:00 par ppito

Cool

j'ai trouvé....

après avoir chargé le /dev/ local dans le chroot, j'ai utilisé e2label pour renomé les partitions...:

Dans le chroot:

e2label /dev/sdxx live-boot... ect....

Enfin un pti mount -a et tout est ok....

6. Le 2007-08-20 16:37:38+02:00 par Diplodocus

Normalement ça aurait dû être fait à l'aide des 3 lignes suivante lors du formatage.

# mke2fs /dev/sda1 -L live-boot
# mke2fs /dev/sda2 -L live-root
# mke2fs /dev/sda3 -L live-home

7. Le 2007-08-21 16:04:50+02:00 par Mathieu

J'ai galèré pour faire fonctionner debootstrap derrière un proxy.

Voici la solution trouvée:

# export http_proxy=http://x.x.x.x:port/
# debootstrap --arch i386 etch /mnt/ http://ftp2.fr.debian.org/debian/

Si ça peut aider quelqu'un...

8. Le 2007-08-21 16:06:23+02:00 par Mathieu

Les adresses http se sont transformées en liens hypertexte, désolé.

9. Le 2008-02-25 18:13:37+01:00 par Olivier G

Bonjour, lorsque je boot sur la clé, tout marche bien sauf que ma carte reseau n'est pas reconnue. Comment faire?

merci

10. Le 2008-02-25 18:22:12+01:00 par Diplodocus

Tout dépend de la carte réseau. Tu peux avoir besoin d'installer des firmwares (pour le sans fils) du genre ipwXXXX.

Pour gérer les réseaux, j'ai sinon ajouté Network manager qui permet de gérer le réseau de façon graphique assez simplement.

11. Le 2008-03-29 19:30:59+01:00 par Cymoud

Je suis ton tuto presque à l'identique et j'ai rencontré une erreur en lançant chroot /mnt :

 # chroot /mnt
zsh: segmentation fault  chroot /mnt

En regardant l'aide de chroot, je vois :

 Si aucune commande n'est fournie, exécuter ``${SHELL} -i'' (par défaut: /bin/sh).

Et comme j'utilise zsh, il ne le trouve pas dans /mnt/bin/zsh Donc pour ceux qui ont le même problème que moi ou si le créateur du tuto veut corriger, il faut utiliser à la place, la commande :

 # chroot /mnt '/bin/bash -i'

12. Le 2008-03-29 20:42:29+01:00 par Cymoud

Dans ton tuto, il faut mettre :

  1. localepurge

au lieu de :

  1. localpurge

13. Le 2008-03-30 19:12:28+02:00 par Diplodocus

Merci de ces deux informations. J'ai corriger l'article pour bien écrire localepurge correctement

14. Le 2008-07-27 13:02:41+02:00 par mondial974

Je suis sous debain lenny depuis sa sortie, je voudrais tester une debian sur clé usb (en vue de remplacer mon DD par une clé usb montée à l'interieur de mon boitier, juste pour le fun). Mais normalement, ne faudrait il pas créer une partition SWAP, comme pour toute installation de debian?

15. Le 2008-07-29 17:18:22+02:00 par Diplodocus

Il est possible de créer une partition de swap sur la clé usb (si la clé a assez de place), mais je le déconseille. Une clé USB n'est pas fait pour et risque de s'user prématurément. Je compte plutot sur le fait que les machines actuelles ont facilement 1Go de mémoire et donc peuvent tourner toute sorte d'application sans avoir besoin de swapper.

16. Le 2008-08-10 20:48:59+02:00 par Jokester

Salut, tout d'abord merci pour ce tutoriel, il est concis et précis, un vrai bonheur. J'ai procédé à l'installation, tout s'est bien déroulé jusqu'au test proprement dit : le boot sur ma clef usb. Le grub est bien lancé, mais j'obtiens une erreur 15 : vmlinuz et initrd ne sont pas trouvés. Effectivement dans /boot je n'ai que le répertoire grub... Mais comment obtenir ces deux fichiers (vmlinuz-2.6.18-4-686 et initrd.img-2.6.18-4-686) ?

Il me semble qu'il faut les compiler à partir de la version du noyau... Mais je ne suis pas chaud pour procéder ainsi, peut-on les télécharger depuis un ftp debian ? Si oui où ?

Merci beaucoup, Jk.

17. Le 2008-08-11 10:11:29+02:00 par Jokester

Erreur de ma part : j'avais bien modifié le /etc/kernel-img.conf, mais la commande aptitude install initrd-tools linux-image-2.6.16-1-686 n'avait pas entièrement fonctionné : l'image 2.6.16 n'étant plus dispo dans le repository. J'ai installé une version plus récente et j'ai pu constater la présence de vmlinuz et initrd.