Contenu | Rechercher | Menus
Selon les tags présents sur cette page, les informations qu'elle contient n'ont pas été vérifiées pour les dernières versions LTS depuis Ubuntu 14.04 LTS.
Apportez votre aide…

Lubuntu USB Creator

Ce tutoriel a pour origine un besoin de remplacer un disque dur défaillant (voir ici). Comme je pouvais difficilement le remplacer (format 1.8" peu commun), je suis parti en quête de solution alternative. Je voulais explorer la possibilité d'utiliser un Live USB, mais sans trop savoir où je m'aventurais. Pris au jeu, cette exploration est devenue un projet à part entière.

Ayant bien-bien-bien avancé sur le sujet et je vous propose aujourd'hui le fruit de mon travail… :-)

Comme je le disais dans mon post initial, j'allais tester la solution du Live USB à partir d'un S-ATA externe connecté par USB.

J'ai réussi à créer un Live USB persistant sur un HDD SATA branché sur une station d'accueil externe et connectée via USB. De plus, j'ai réussi à créer un script 'OneTouch' qui construit lui même le Live USB à partir de nos réglages.

Je l'ai appelé L.U.C. (Lubuntu USB Creator).

Comme je suis trop content :-) !

Ce document est devenu très grand et tout ne sera pas utile pour tout le monde.

Pour ceux qui sont juste curieux du résultat, vous pouvez directement lire le chapitre Pré-requis puis poursuivre par Mode d'emploi (temps d'installation estimé : 20 minutes)
Si vous avez des commentaires, remarqué des erreurs ou adapté le script à d'autres distributions, n'hésitez pas à faire un retour sur le forum.

Pré-requis

Pour mettre tout ça en place, vous aurez besoins des éléments suivants :

Pour connaître l'architecture du micro-processeur :

lscpu |grep bit
  • Un PC pour construire le support USB, appelons le PC-BUILDER (voir les plateformes supportées)
  • Un disque dur externe SATA + station accueil SATA reliée par USB ou eSATA (pour ceux qui ne connaissent pas : http://lmgtfy.com/?q=station+accueil+sata+usb) ; pour ceux qui n'ont pas un tel matériel une simple clé USB de 2 GB mini fera l'affaire pour tester.
ATTENTION : la technologie d'une clé USB n'étant pas prévue pour les multiples écritures nécessaires au fonctionnement d'un OS, il en résultera une durée de vie réduite, vous voilà prévenu !
  • Un autre PC pour tester, appelons le PC-LIVE qui servira d'hôte à notre Live USB (il ne touchera pas à l'éventuel OS en place) ; si on n'a pas de 2ème PC on peut utiliser PC-BUILDER, seulement ce sera moins pratique (surtout pour l'accès distant ^^ )
Maintenant que vous avez les pré-requis, peut être voudriez-vous tester la finalité (temps estimé : 20 min) ?

Plateformes supportées

Ces couples de plateformes ont été testées avec succès :

OS PC-BUILDER CPU OS PC-LIVE CPU RMQ
Ubuntu 12.04 LTS 32 bits 32 bits Lubuntu 14.10 32 bits 32 bits
Ubuntu 14.04 LTS 64 bits 32 bits Lubuntu 14.10 32 bits 32 bits environnement VM
N'hésitez pas à faire un retour sur le forum, pour faire évoluer cette liste.

Un live USB persistant ?

Le Net regorge de tutoriels pour créer des Live CD et Live USB .

Mais au fait c'est quoi un Live xx ?

C'est la possibilité de démarrer un mini OS pour par exemple installer un système un peu plus costaud ou tout simplement le tester sans affecter l'éventuel système déjà en place.

Comme les CDs c'est un peu galère, on a créé les Live USB qui sont plus rapides et plus {ergonom|économ|écolog}iques.

Cerise sur le gateau, la persistance. Ben oui, pourquoi ne pas pouvoir enregistrer ses réglages, ses fichiers aussi ?

La persistance a réglé le problème, à un tel point qu'on pourrait presque songer à remplacer son vieux OS par un Live USB persistant (sisi j'vous jure :-P ).

A noter que de base, la persistance réside dans un fichier nommé casper-rw de 4 GB maxi (limitation FAT32) et se trouve à la racine du support.

Ce que je vous propose ici

Un Live USB dont la persistance se fera sur une partition à part entière dédiée. Il sera équipé du système d'exploitation Lubuntu, car très léger. Il sera accessible à distance via SSH ou par VNC à une adresse IP définie AVANT la création du support. Il sera en français, à l'heure et aura comme unique utilisateur … vous ! Il possèdera les fonctions de base d'un système d'exploitation : client navigateur Internet, éditeur de texte, navigateur de fichiers, Disk, GParted, etc. En outre, il intégrera tous les outils que vous jugerez bon de lui ajouter (avant ou après sa création).

Il faut ajouter que tout se configure avant l'installation en renseignant quelques paramètres (pas de quoi foueter un chat non plus hein !).

Le top must de la mort qui tue :-), in situ on pourra réinitialiser le support comme si on venait de le créer (reboot nécessaire) et on pourra même modifier sa propre installation sans repasser par la re-création du support (plus d'explications dans le mini How-To)

Fonctionnement d'un support bootable

J'ai fait une grosse recherche sur tout le mécanisme de boot et je me propose de vous exposer mes découvertes. Cette partie optionnelle est longue et technique, mais elle n'est pas complexe. De plus, j'ai précisé mes sources. Bonne lecture !
Ce que je décris ici, c'est ce que j'ai compris après plein, plein, pleins de lectures sur le sujet. Des sujets qui parfois se contredisent, surtout au niveau des termes. Je ne garanti pas l'exactitude, mais je suis parti du principe que quand plusieurs explications vont dans le même sens, c'est qu'elle doivent être vraies ou tendre vers la vérité. Ensuite, il y a mes propres expériences (réalisées avec mes mimines à moi), le bon sens et l'intuition. Toutefois quand j'annonce quelque chose, j'essaye dans la mesure du possible de citer mes sources. Si vous voyez des erreurs n'hésitez pas à le signaler, mais dans la même optique, en citant vos sources.

Nota : ici je ne parle que du mécanisme de boot par BIOS / MBR ; je m'attaquerais peut être plus tard au boot UEFI / GPT encore que je ne sois pas sûr que des Live USB de plus de 2 TB soient pertinents.

Le schéma à avoir en tête (source) :

mbr_secteurs-01.jpg

Nota : BS (Boot Sector) sera nommé VBR, dans les explications suivantes, car boot sector est un terme trop générique.

Je passe toutes les étapes (très intéressantes) sur le démarrage physique et électronique du PC, pour arriver à la dernière étape de traitement du BIOS après le POST (Power-On Self-Test)

Le BIOS cherche le premier support bootable, dont on peut définir soi-même l'ordre de recherche (boot sequence) ou à la demande avec la touche F12 (ou autre), puis exécute le code du MBR…

Support bootable et MBR

Q : Qu'est ce qu'un support bootable ?
R : C'est un support qui lors du démarrage d'un PC, va exécuter du code pour charger un système d'exploitation ou autres. Pour permettre cela, il faut que les premiers octets du support constituent un MBR bootable ou plus rarement, un VBR bootable (voir plus bas).

Q : Qu'est ce qu'un MBR (Master Boot Record) ?
R : C'est le premier secteur adressable d'un disque dur (cylindre 0, tête 0 et secteur 1, ou secteur 0 en adressage logique) dans le cadre d'un partitionnement Intel. (wiki). Par héritage, pour adapter aux supports autres que le disque dur, on dira que le MBR ce sont les 512 premiers octets de n'importe quel support bootable.

Nota :

fdisk -l /dev/<device>

retourne l'adresse en CHS (Cylinder, Head, Sector) et l'adresse du premier secteur LBA (Logical Block Address) MEME si le support est une simple clé USB, alors que physiquement il n'y a ni cylindres, ni têtes de lecture sur une clé USB (comme quoi l'héritage…)

Q : Quel est le contenu d'un MBR ?
R : Un code exécutable (appelons la routine_MBR), d'éventuels messages d'erreurs en cas de problème, le descripteur des partitions principales, une signature de contrôle facultative et se termine obligatoirement par les octets "55 aa" qui représentent le nombre magique 0xaa55 (wiki) pour distinguer un support bootable d'un autre (sources)

Attention : le nombre magique ne suffit pas en soi, pour déterminer si le support est réellement bootable, il faut également qu'une partition soit active (voir dessous) !

On peut visualiser le contenu hexadécimal/ASCII d'un MBR grâce à la commande hexdump ou hd

hd /dev/<device> -n 512 -s 0
$ hd /dev/sde -n 512 -s 0
00000000  fa b8 00 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |................|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|
00000040  4c 02 cd 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  30 85 09 00 00 00 80 01  |........0.......|
000001c0  01 00 0c fe 3f 79 3f 00  00 00 bb e7 1d 00 00 00  |....?y?.........|
000001d0  01 7a 83 fe ff ff fa e7  1d 00 c7 a2 83 12 00 00  |.z..............|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

Vous remarquerez que cette section se termine par "55 aa", on a donc le nombre magique 0xaa55, on visualise donc le MBR d'un disque bootable

Nota : * indique que la ligne du dessus est répétée plusieurs fois

Q : Que contient le descripteur de partitions principales ?
R : 64 octets décrivant les 4 partitions principales. Pour chacune des partitions sur 16 octets (16*4=64), on sait si la partition est active (donc bootable), on connait son système de fichiers sous-jacent (FS : File System), sa taille et sa position (sources)

En reprenant l'affichage hexdump du dessus :

000001b0                                             80 01  |              ..|
000001c0  01 00 0c fe 3f 79 3f 00  00 00 bb e7 1d 00        |....?y?.......  |

000001c0                                             00 00  |              ..|
000001d0  01 7a 83 fe ff ff fa e7  1d 00 c7 a2 83 12        |.z............  |

000001d0                                             00 00  |              ..|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00        |..............  |

Ici :

  • Le 1er bloc (ligne 000001b0) représente le descripteur de partition 1 : le 80 du début indique que la partition est active (et donc bootable).
  • Le 2ème bloc (ligne 000001c0) représente le descripteur de la partition 2 : le 00 du début indique que la partition n'est pas active (donc n'est pas bootable).
  • Le 3ème bloc (commence à la ligne 000001d0) représente les descripteurs des partitions 3 et 4 : comme elles sont remplies de "00", cela indique qu'il n'y a pas de 3ème et 4ème partition.

Pour plus d'explications, voir ici.

Partition principale / étendue

Q : Que trouve t-on au début d'une partition principale ?
R : 512 octets qui constituent, soit le début d'un secteur de boot de volume (VBR), soit un secteur de boot de partition étendue (EBR) - (sources).

Q : Qu'est ce qu'une partition étendue ?
R : Permet d'étendre le nombre de partitions pour dépasser la limite des 4 partitions principales.

FIXME Q : Que contient un secteur de boot d'une partition étendue ?
R : Même type de structure qu'un MBR (EBR), en revanche semble commencer par une instruction de saut.

VBR et bootloader

Q : Qu'est ce qu'un VBR (Volume Boot Record) ?
R : C'est un secteur de boot de partition. Les informations qu'elle contient, varient selon le FS sous-jacent. Certains supports contiennent directement un VBR sans MBR parent ; c'est le cas de nos vieilles disquettes (wiki)

Nota : la taille d'un VBR dépend du FS sous-jacent (FAT32 : 32 secteurs, NTFS : 16 secteurs - source)

Q : Quel est le contenu d'un VBR ?
R : Un VBR commence toujours par une instruction de saut vers le code exécutable que nous appellerons routine_VBR, est suivi par le BPB qui donne les caractéristiques physiques de la partition et surtout l'adresse de la table d'allocation de fichiers, suivi de la routine_VBR, les éventuels messages d'erreur, et comme pour le MBR, elle se termine par le nombre magique 0xaa55 (source). La routine_VBR exécutera le bootloader.

Nota : on peut visualiser le contenu hexadécimal/ASCII d'un VBR de partition grâce à la commande hexdump

hd /dev/<device><num_part> -n 512 -s 0
$ hd /dev/sde1 -n 512 -s 0
00000000  eb 58 90 53 59 53 4c 49  4e 55 58 00 02 08 20 00  |.X.SYSLINUX... .|
00000010  02 00 00 00 00 f8 00 00  3f 00 ff 00 00 00 00 00  |........?.......|
00000020  bb e7 1d 00 78 07 00 00  00 00 00 00 02 00 00 00  |....x...........|
00000030  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 01 29 04 22 bd 91 4c  5f 4c 55 42 55 4e 54 55  |..)."..L_LUBUNTU|
00000050  20 20 46 41 54 33 32 20  20 20 fa fc 31 c9 8e d1  |  FAT32   ..1...|
00000060  bc 76 7b 52 06 57 1e 56  8e c1 b1 26 bf 78 7b f3  |.v{R.W.V...&.x{.|
00000070  a5 8e d9 bb 78 00 0f b4  37 0f a0 56 20 d2 78 1b  |....x...7..V .x.|
00000080  31 c0 b1 06 89 3f 89 47  02 f3 64 a5 8a 0e 18 7c  |1....?.G..d....||
00000090  88 4d f8 50 50 50 50 cd  13 eb 62 8b 55 aa 8b 75  |.M.PPPP...b.U..u|
000000a0  a8 c1 ee 04 01 f2 83 fa  4f 76 31 81 fa b2 07 73  |........Ov1....s|
000000b0  2b f6 45 b4 7f 75 25 38  4d b8 74 20 66 3d 21 47  |+.E..u%8M.t f=!G|
000000c0  50 54 75 10 80 7d b8 ed  75 0a 66 ff 75 ec 66 ff  |PTu..}..u.f.u.f.|
000000d0  75 e8 eb 0f 51 51 66 ff  75 bc eb 07 51 51 66 ff  |u...QQf.u...QQf.|
000000e0  36 1c 7c b4 08 e8 e9 00  72 13 20 e4 75 0f c1 ea  |6.|.....r. .u...|
000000f0  08 42 89 16 1a 7c 83 e1  3f 89 0e 18 7c fb bb aa  |.B...|..?...|...|
00000100  55 b4 41 e8 cb 00 72 10  81 fb 55 aa 75 0a f6 c1  |U.A...r...U.u...|
00000110  01 74 05 c6 06 46 7d 00  66 b8 88 1a 02 00 66 ba  |.t...F}.f.....f.|
00000120  00 00 00 00 bb 00 80 e8  0e 00 66 81 3e 1c 80 5e  |..........f.>..^|
00000130  30 95 71 75 74 e9 f8 02  66 03 06 60 7b 66 13 16  |0.qut...f..`{f..|
00000140  64 7b b9 10 00 eb 2b 66  52 66 50 06 53 6a 01 6a  |d{....+fRfP.Sj.j|
00000150  10 89 e6 66 60 b4 42 e8  77 00 66 61 8d 64 10 72  |...f`.B.w.fa.d.r|
00000160  01 c3 66 60 31 c0 e8 68  00 66 61 e2 da c6 06 46  |..f`1..h.fa....F|
00000170  7d 2b 66 60 66 0f b7 36  18 7c 66 0f b7 3e 1a 7c  |}+f`f..6.|f..>.||
00000180  66 f7 f6 31 c9 87 ca 66  f7 f7 66 3d ff 03 00 00  |f..1...f..f=....|
00000190  77 17 c0 e4 06 41 08 e1  88 c5 88 d6 b8 01 02 e8  |w....A..........|
000001a0  2f 00 66 61 72 01 c3 e2  c9 31 f6 8e d6 bc 68 7b  |/.far....1....h{|
000001b0  8e de 66 8f 06 78 00 be  da 7d ac 20 c0 74 09 b4  |..f..x...}. .t..|
000001c0  0e bb 07 00 cd 10 eb f2  31 c0 cd 16 cd 19 f4 eb  |........1.......|
000001d0  fd 8a 16 74 7b 06 cd 13  07 c3 42 6f 6f 74 20 65  |...t{.....Boot e|
000001e0  72 72 6f 72 0d 0a 00 00  00 00 00 00 00 00 00 00  |rror............|
000001f0  00 00 00 00 00 00 00 00  fe 02 b2 3e 18 37 55 aa  |...........>.7U.|
00000200

En reprenant l'affichage hexdump du dessus :

00000000  eb 58 90                                          |.X.             |

00000000           53 59 53 4c 49  4e 55 58                 |   SYSLINUX    |

00000000                                       02 08 20 00  |            .. .|
00000010  02 00 00 00 00 f8 00 00  3f 00 ff 00 00 00 00 00  |........?.......|
00000020  bb e7 1d 00 78 07 00 00  00 00 00 00 02 00 00 00  |....x...........|
00000030  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 01 29 04 22 bd 91 4c  5f 4c 55 42 55 4e 54 55  |..)."..L_LUBUNTU|
00000050  20 20 46 41 54 33 32 20  20                       |  FAT32         |

00000050                              20 fa fc 31 c9 8e d1  |          ..1...|
00000060  bc 76 7b 52 06 57 1e 56  8e c1 b1 26 bf 78 7b f3  |.v{R.W.V...&.x{.|
00000070  a5 8e d9 bb 78 00 0f b4  37 0f a0 56 20 d2 78 1b  |....x...7..V .x.|
00000080  31 c0 b1 06 89 3f 89 47  02 f3 64 a5 8a 0e 18 7c  |1....?.G..d....||
00000090  88 4d f8 50 50 50 50 cd  13 eb 62 8b 55 aa 8b 75  |.M.PPPP...b.U..u|
000000a0  a8 c1 ee 04 01 f2 83 fa  4f 76 31 81 fa b2 07 73  |........Ov1....s|
000000b0  2b f6 45 b4 7f 75 25 38  4d b8 74 20 66 3d 21 47  |+.E..u%8M.t f=!G|
000000c0  50 54 75 10 80 7d b8 ed  75 0a 66 ff 75 ec 66 ff  |PTu..}..u.f.u.f.|
000000d0  75 e8 eb 0f 51 51 66 ff  75 bc eb 07 51 51 66 ff  |u...QQf.u...QQf.|
000000e0  36 1c 7c b4 08 e8 e9 00  72 13 20 e4 75 0f c1 ea  |6.|.....r. .u...|
000000f0  08 42 89 16 1a 7c 83 e1  3f 89 0e 18 7c fb bb aa  |.B...|..?...|...|
00000100  55 b4 41 e8 cb 00 72 10  81 fb 55 aa 75 0a f6 c1  |U.A...r...U.u...|
00000110  01 74 05 c6 06 46 7d 00  66 b8 88 1a 02 00 66 ba  |.t...F}.f.....f.|
00000120  00 00 00 00 bb 00 80 e8  0e 00 66 81 3e 1c 80 5e  |..........f.>..^|
00000130  30 95 71 75 74 e9 f8 02  66 03 06 60 7b 66 13 16  |0.qut...f..`{f..|
00000140  64 7b b9 10 00 eb 2b 66  52 66 50 06 53 6a 01 6a  |d{....+fRfP.Sj.j|
00000150  10 89 e6 66 60 b4 42 e8  77 00 66 61 8d 64 10 72  |...f`.B.w.fa.d.r|
00000160  01 c3 66 60 31 c0 e8 68  00 66 61 e2 da c6 06 46  |..f`1..h.fa....F|
00000170  7d 2b 66 60 66 0f b7 36  18 7c 66 0f b7 3e 1a 7c  |}+f`f..6.|f..>.||
00000180  66 f7 f6 31 c9 87 ca 66  f7 f7 66 3d ff 03 00 00  |f..1...f..f=....|
00000190  77 17 c0 e4 06 41 08 e1  88 c5 88 d6 b8 01 02 e8  |w....A..........|
000001a0  2f 00 66 61 72 01 c3 e2  c9 31 f6 8e d6 bc 68 7b  |/.far....1....h{|
000001b0  8e de 66 8f 06 78 00 be  da 7d ac 20 c0 74 09 b4  |..f..x...}. .t..|
000001c0  0e bb 07 00 cd 10 eb f2  31 c0 cd 16 cd 19 f4 eb  |........1.......|
000001d0  fd 8a 16 74 7b 06 cd 13  07 c3 42 6f 6f 74 20 65  |...t{.....Boot e|
000001e0  72 72 6f 72 0d 0a 00 00  00 00 00 00 00 00 00 00  |rror............|
000001f0  00 00 00 00 00 00 00 00  fe 02 b2 3e 18 37 55 aa  |...........>.7U.|
00000200

On peut notera que :

  • Les 3 premiers octets constituent une instruction de saut de 88 octets (58h=88d ; 58 en héxadécimal correspond à 88 décimal). Donc on va "sauter" 88 octets qui nous emmène directement au 4ème bloc (ligne 0000050)
  • Les 8 octets suivants concernent le OEM ID (en gros qui a créé le VBR) : ici on voit que c'est SYSLINUX
  • Le bloc suivant concerne le BPB (BIOS parameter block) qui décrit la couche physique du support ; également on peut voir en clair le libellé du support (ici L_LUBUNTU), ainsi que le FS (ici le système de fichier est en FAT32)
  • Le dernier bloc commence par la routine_VBR (exécuté après l'instruction de saut), suivi des messages d'erreur
  • Encore et toujours, les deux derniers octets constituent le nombre magique 0xaa55

Plus d'explications ici (attention : en anglais et pour utilisateurs avertis)

Q : Qu'est ce qu'un bootloader ?
R : C'est un programme en lecture seule accessible dans le système de fichiers (généralement on peut le voir avec un simple ls). Son rôle est de charger en mémoire un mini-système d'exploitation qui à son tour pourra charger un système d'exploitation "lourd" (Ubuntu, Windows).

En résumé

On peut dire ici que le démarrage se fait en trois temps après le POST. Le BIOS exécute la routine_MBR, qui exécute à son tour la routine_VBR, qui exécute elle même le boot loader. Rien n'empêche de le faire en deux temps : le BIOS exécute la routine_MBR qui exécute elle même le bootloader. Voir en un temps, le BIOS exécute la routine_MBR qui se trouve être le fichier bootloader. Aussi, je rappelle qu'on peut très bien avoir un VBR sans MBR (cas des disquettes).

Tout ça pour dire, que finalement tout est possible, selon "comment" on écrit le BIOS, la routine de MBR / VBR, etc.

Ceci explique certainement, pourquoi les explications concernant le boot, sont floues et divergentes. En tout cas j'espère vous avoir éclairé sur ses possibilités.

Installation manuelle du Live USB

Avant d'élaborer le script OneTouch, je suis bien évidemment passé par la phase "installation à la mano".

Ce guide manuel est dédié pour un live USB "Lubuntu 14.10 32 bits" qui a été créé depuis un PC équipé de "Ubuntu 12.04 LTS 32 bits" (PC-BUILDER) ; si vous n'avez pas ces prérequis, vous aurez certainement à adapter les consignes suivantes.

Préparation

Pour créer le support avec une persistance dans une partition /casper-rw, j'ai suivi ce lien qui utilise l'outil "Créer un disque de démarrage" et GParted (Installez les paquets gparted).

L'outil "Créer un disque de démarrage" est par défaut sous Ubuntu et contient quelques bugs. Entre autres :

  • Pour une raison que j'ignore, parfois le support disparait au bout d'un moment ; il suffit de rebrancher le support pour qu'il réapparaisse
  • Apparemment, si on utilise une connexion eSATA, le support ne sera pas détecté par l'application (en tout cas, moi je n'ai pas réussi), donc uniquement en connexion USB

Session Live FR et silencieuse

Modifier le fichier de configuration (Ouvrez le fichier <racine_support_usb>/syslinux/syslinux.cfg).

Remplacer son contenu par :

DEFAULT live
LABEL live
  SAY Lubuntu USB Live Persistant
  KERNEL /casper/vmlinuz
  APPEND noprompt persistent boot=casper initrd=/casper/initrd.lz quiet splash \
  locale=fr_FR.UTF-8 console-setup/layoutcode=fr

Remplacer le fichier gfxboot.c32

Remplacer le fichier gfxboot.c32 du support par celui du PC-BUILDER de création :

sudo cp /usr/lib/syslinux/gfxboot.c32 <racine_support_usb>/syslinux/gfxboot.c32

Nota :
Si on ne fait pas cette étape, le boot automatique ne marchera pas et se soldera par un prompt "boot :". Dans ce cas, on n'aura plus qu'à taper manuellement "live" (sans les guillemets), suivi d'un appui la touche Entrée.

Mettre en place le PC-LIVE

Brancher le live USB sur un PC de test éteint (PC-LIVE)

S'assurer que le PC-LIVE est relié physiquement au réseau (au besoin démarrez le et vérifiez que vous avez accès au réseau).

Démarrer le PC-LIVE et configurer le BIOS pour qu'il démarre sur le Live USB ou bien choisir le support depuis la liste des périphériques (F12 ou autre).

NB : je ne décris pas cette étape qui varie d'une machine à une autre, toutefois une recherche avec votre moteur de recherche favori, devrait donner rapidement la solution.

1er démarrage : Live session

Vous venez de démarrer le support avec succès et le bureau est affiché. Il ne reste plus qu'à personnaliser et ajouter un nouvel utilisateur (vous).

On peut noter qu'il y a un raccourci "Installer Lubuntu" sur le bureau

Modifier adresse IP via Network Manager

  • Icône réseau en bas à droite > Modification des connexions (Edit Connections)
  • Sélectionner : Connexion filaire 1 (Wired connection 1)
  • Modifier (Edit)
    • Onglet "Paramètres IPv4" (IPv4 settings) et renseigner (adapter à votre cas) :
      • Méthode (Method) : manuelle (manual)
      • Adresse (Address) : 192.168.0.3
      • Masque réseau (Netmask) : 24 (/24 soit 255.255.255.0)
      • Passerelle (Gateway) : 192.168.0.254
      • DNS (DNS servers) : 8.8.8.8
    • Enregistrer (Save)
  • Fermer (Close)

Environnement complet en FR

  • Menu démarrer > Préférences > Prise en charge des langues
  • Popup "La prise en charge des langues n'est pas complètement installée"
    • Installer
  • Installer / Supprimer des langues
    • Cocher : Français
    • Décocher : Anglais
    • Appliquer les changements
  • Appliquer à tout le système
  • Close

Installer SSH et VNC

  • Menu démarrer > Outils système > Gestionnaire de paquets Synaptic
  • Popup "Présentation rapide"
    • Fermer
  • Tout mettre à niveau
  • Rechercher
  • Saisir : openssh-server
    • Rechercher
  • Cocher > Sélectionner pour l'installation
    • Ajouter à la sélection
  • Refaire une recherche pour vino et pour x11vnc
  • Appliquer
  • Popup "Appliquer les modification suivantes"
    • Appliquer
  • Popup "Les modifications ont été appliquées"
    • Fermer
  • Fermer

Créer votre utilisateur (vous)

  • Menu démarrer > Outils système > Utilisateurs et groupes
  • Ajouter et renseigner les différents champs (adapter) :
    • Nom : mon nom complet
    • Utilisateur : mon_login
    • Valider
  • Popup "Modifier le mot de passe de l'utilisateur" (adapter) :
    • Nouveau mot de passe : mot_de_passe_super_baleze
    • Confirmation (retaper) :
    • Cocher (option) "Ne pas demander de mot de passe à la connexion"
    • Valider
  • Gérer les groupes
    • Sélectionner le groupe sudo
    • Propriétés
      • Cocher "vous" dans la liste des membres du groupe
      • Valider
    • Fermer
  • Fermer

Ouverture auto de session

  • Menu démarrer > Accessoires > LXTerminal
  • Saisir les lignes suivantes (adapter mon_login) et les exécuter :
ME=<mon_login>
sudo sed -i "s/lubuntu/$ME/g" /etc/lightdm/lightdm.conf
exit
  • Menu démarrer > Déconnexion > Redémarrer

2ème démarrage : votre session

Vous venez d'ouvrir automatiquement votre session avec succès. Il ne reste plus qu'à supprimer l'utilisateur par défaut de la Live session "lubuntu" et configurer l'accès VNC.

Vous pourrez constater, qu'il N'Y A PLUS de raccourci "Installer Lubuntu" sur le bureau

Supprimer l'utilisateur "lubuntu" et son groupe

  • Menu démarrer > Accessoires > LXTerminal
  • Saisir les lignes suivantes telles quelles et les exécuter :
LU=lubuntu
sudo deluser $LU
sudo usermod -g $USER $LU
sudo delgroup $LU
sudo rm -rf /home/$LU
sudo sed -i "s/^$LU/$USER/g" /etc/sudoers.d/casper
sudo sed -i "/^$LU:/d" /etc/passwd
sudo sed -i "/^$LU:/d" /etc/shadow
exit

Configurer VNC

Autoriser l'accès distant :

  • Menu démarrer > Exécuter et saisir :
    vino-preferences
    • Cocher "Autoriser d'autres utilisateurs à voir votre bureau"
    • Fermer

Sécuriser l'échange par VNC :

  • Menu démarrer > Accessoires > LXTerminal
  • Saisir les lignes suivantes telles quelles et les exécuter :
    • x11vnc -storepasswd
      • Renseigner mot de passe : mot_de_passe_super_baleze
      • Confirmation (retaper) :
      • Write password to … : y
    • exit

Démarrage automatique de VNC :

  • Menu démarrer > Accessoires > LXTerminal
  • Saisir les lignes suivantes telles quelles et les exécuter :
sudo bash -c "echo x11vnc -rfbauth /home/$USER/.vnc/passwd -forever -repeat -display :0 \& >> /etc/profile"
exit
  • Menu démarrer > Déconnexion > Redémarrer

Tests d'accès distant

Désormais on peut accéder à distance par SSH : depuis le terminal d'un PC (appelons le PC-CLIENT, exécuter la ligne suivante dans un terminal :

ssh <mon_login>@<ip_PC-LIVE>

(ex : ssh lnj@192.168.0.3)

Et on peut également accéder avec un client VNC, pour ma part j'ai utilisé Remmina.

Il faut configurer la connexion comme ceci (adapter) :

  • Nom : nom_du_profil (ex : live_pc)
  • Protocole : "VNC - Virtual Network Computing"
  • Serveur : 192.168.0.3 (adresse statique du serveur)
  • Nom d'utilisateur : mon_login
  • Mot de passe (celui généré par x11vnc -storepasswd) : mot_de_passe_super_baleze
  • Profondeur de couleur : autre chose que 256 couleurs (sinon ne marche pas)
  • Se connecter

Et voilou :-) !

L.U.C. (Lubuntu USB Creator)

Fonctionnement

Nous allons voir ici, le fonctionnement interne de votre Live USB.

Cette partie optionnelle est longue et technique, mais elle n'est pas complexe. Bonne lecture !
Volontairement, je ne donne pas trop d'explications dans la section qui suit, car je maitrise mal et ça alourdirait.

Si vous avez lu le chapitre Fonctionnement d'un support bootable, le début devrait vous sembler limpide.

Donc, vous branchez votre support USB et vous démarrez la machine. Le BIOS effectue le POST et détermine le premier support bootable.

Et ensuite ?

Boot support

Le BIOS va exécuter la routine_MBR (construite par la commande parted /dev/<device> mklabel -s "msdos"), qui à son tour va exécuter la routine_VBR (construite par la commande syslinux /dev/<device>), qui va exécuter le boot loader (fichier /ldlinux.sys créé par la commande syslinux précédente).

Le bootloader syslinux

A ce stade, syslinux ce n'est qu'un simple prompt (c.a.d. un curseur qui clignote sur fond noir :-) ) qui attend que vous saisissiez quelque chose, avant d'appuyer sur la touche Entrée. En réalité, il attend que vous lui fournissiez un kernel.

Vous pourriez simplement taper manuellement (sur un clavier QWERTY of course ;-) ) :

/casper/vmlinuz /casper/initrd.lz

Et ça marcherait (explication plus bas) !

Fort heureusement, /syslinux.sys est accompagné d'un fichier /syslinux/syslinux.cfg qui automatise son fonctionnement.

Donc, /syslinux.sys va lire /syslinux/syslinux.cfg, en déduire et exécuter /casper/vmlinuz /casper/initrd.lz suivi des autres joyeusetés, telles que désactiver le network-manager pour le remplacer par ifup, indiquer la persistance, booter silencieusement (écran splash à l'appui), etc.

Que sont ces fichiers du dossier /casper :

  • /casper/vmlinuz : kernel de linux au format compressé (d'où le "z" au lieu du "x"), c'est à dire le noyau de linux, par défaut sans interractions extérieures possibles et qui sera chargé en mémoire vive.
  • /casper/initrd.lz : (initial ramdisk) ajoute une sorte de mini système d'exploitation (compressé et lui aussi en mémoire vive) qui permettra, entre autre, d'interagir sur le kernel, de lui ajouter des pilotes et des fonctionnalités, mais aussi, il permettra de dialoguer avec l'utilisateur.

Pour s'en convaincre, si le chargement du système échoue après l'exécution du boot loader /syslinux.sys, on se retrouve avec une ligne de commande (initramfs) avec un shell qui prend en compte les commandes busybox (wiki).

Maintenant que le mini-système et ses pilotes sont en mémoire, l'installation Live commence…

1er démarrage système

Ne maitrisant pas du tout le processus de boot du système Live, je préfère m'abstenir de dire des bêtises et sauter directement à la phase suivante

Notre système de fichier est monté.

L'étape suivante c'est l'exécution automatique de /etc/profile (point d'entrée sous notre contrôle - voir synoptique), qui va exécuter un script externe au système /cdrom/scripts/runme1st_from_ext.sh (externe, car il se trouve sur la première partition du Live USB). Cette étape va s'effectuer APRES l'ouverture de la Live session, lorsque le bureau sera affiché, pour avoir une interaction avec l'utilisateur final (vous). Ce dernier pourra alors suivre les opérations en cours dans un terminal. Si on ne lui montre pas, il aura l'impression que le démarrage dure (c'est tordu, mais ça marche :D !)

Remarque importante :

Pour arriver à créer ce point d'entrée, on a extrait le contenu du fichier <racine_live_usb>/casper/filesystem.squashfs (système d'exploitation au format compressé SQUASHFS en lecture seule), on en a modifié le fichier <racine_contenu>/etc/profile et on a reconstruit <racine_live_usb>/casper/filesystem.squashfs. La modification ayant inséré dans /etc/profile une unique instruction qui dit tout simplement : exécute le fichier externe /cdrom/scripts/runme1st_from_ext.sh (voir synoptique)

Ce script externe va supprimer son propre déclencheur dans /etc/profile (pour éviter qu'il soit exécuté à chaque démarrage) et réaliser la première phase de post-installation.

Cette première phase va permettre d'installer le système aux petits oignons : sa configuration réseau, ses outils, ses réglages, l'utilisateur final (vous), l'accès distant et dernière étape, la création du script /home/runmelast.sh avec son déclencheur ajouté dans /etc/rc.local.

/home/runmelast.sh sera exécuté après redémarrage.

Cette première phase s'achève avec le redémarrage de la machine.

2ème démarrage système

La deuxième phase de post-installation démarre avec l'exécution automatique du script /etc/rc.local qui exécute à son tour /home/runmelast.sh.

/home/runmelast.sh va supprimer : l'utilisateur de la Live session qui n'est plus utile et qui a un mot de passe vide (on ne pouvait pas le faire avant car on était sur sa propre session, donc impossible de se supprimer soi-même), son déclencheur dans /etc/rc.local, lui-même.

Et voilou !

Synoptique et rôle des fichiers

Synoptique de LUC :

Rôle des fichiers :

  • luc : dossier projet
  • luc/iso : montage du fichier ISO
  • luc/iso/casper/filesystem.squashfs : le filesystem du Live CD au format squashfs
  • luc/liveusb : dossier montage du support USB
  • luc/liveusb/casper/filesystem.squashfs : le filesystem du Live USB au format squashfs RO
  • luc/liveusb/casper/vmlinuz : le kernel linux compressé qui sera chargé en mémoire
  • luc/liveusb/casper/initrd.lz : sorte de mini-OS chargé en mémoire, qui interface kernel + utilisateur
  • luc/liveusb/idlinux.sys : bootloader qui rend le support bootable (généré par syslinux)
  • luc/liveusb/scripts : scripts externes au live USB (accessible depuis /cdrom du Live USB)
  • luc/liveusb/scripts/reset.sh : réinitialise tout comme au premier boot (donnée persistantes de casper-rw perdues)
  • luc/liveusb/scripts/runme1st_from_ext.sh : script auto-déclenché au premier boot du Live USB par le point d'entrée /etc/profile
  • luc/liveusb/syslinux/gfxboot.c32 : fichier remplacé par celui de PC-BUILDER
  • luc/liveusb/syslinux/syslinux.cfg : configuration de boot du Live USB
  • luc/squashfs : dossier montage de luc/filesystem.squashfs
  • luc/custom-squashfs : dossier RW sur une copie du contenu de luc/iso/casper/filesystem.squashfs, on ajoute uniquement le point d'entrée dans /etc/profile vers /cdrom/scripts/runme1st.sh
  • luc/filesystem.squashfs : copie en RW de luc/iso/casper/filesystem.squashfs en RO

Nota : RW (Lecture / Ecriture), RO (Lecture seule)

Mode d'emploi

Pour automatiser la gestion du réseau, je n'ai pas eu d'autre choix, que de me passer du Network Manager qui n'est pas configurable en ligne de commande sous Ubuntu. La version nmcli ne permet pas le paramétrage sous Ubuntu (apparemment sous les autres distributions ça marche). Je ne le désinstalle pas, il est seulement "caché" par le paramètre ip=frommedia de <racine_live_USB>/syslinux/syslinux.cfg. Supprimer le paramètre et redémarrer permettra d'utiliser à nouveau le Network Manager.

Copier le contenu du script OneTouch et le coller dans le fichier luc_onetouch_install.sh

Donnez vous les droits d'exécution :

chmod u+x luc_onetouch_install.sh

Déterminer le support que vous allez utiliser :

lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,MOUNTPOINT

Configurer paramètres fonctionnels (ou laisser les valeurs par défaut)

  • DEV : c'est un support entier choisi et non une partition (ex : DEV=/dev/sde)
  • ISO : chemin absolu du fichier ISO de Lubuntu (ex : ISO='/ISO/lubuntu-14.10-desktop-i386.iso'
  • ME : c'est … vous, le nom de login de votre utilisateur (ex : ME=lnj)
  • ME_FULL : c'est encore vous mais avec le nom long (ex : ME_FULL='Le nain jaune')
  • NET_ADDRESS : adresse IP statique donnée au PC-LIVE (ex : NET_ADDRESS=192.168.0.3)
  • NET_NETMASK : masque réseau du réseau de PC-LIVE (ex : NET_NETMASK=255.255.255.0)
  • NET_GATEWAY : la passerelle du réseau de PC-LIVE (ex : NET_GATEWAY=192.168.0.254)
  • NET_DNS : un serveur DNS accessible par le PC-LIVE (ex : NET_DNS=8.8.8.8)

Configurer les paramètres pré-configurés (ou laisser les valeurs par défaut)

Remarque : pour plus de détails, voir le script OneTouch

  • USB_LABEL : le nom de la partition 1 de votre Live USB (ex : USB_LABEL=L_LUBUNTU)
  • USB_PART1_SIZE : la taille de la partition 1 (ex : USB_PART1_SIZE=1G)
  • USB_PART2_SIZE : la taille de la partition 2 (ex : USB_PART2_SIZE=100%)
  • LIVE_USB_BOOT_MESSAGE : Message de bienvenue lors du démarrage (ex: LIVE_USB_BOOT_MESSAGE='Lubuntu USB Live Persistant'
  • LIVE_USB_BOOT_QUIET : indique si le démarrage est verbeux / silencieux (0/1) (ex : LIVE_USB_BOOT_QUIET=1)
  • ME_DEFAULT_PASSWORD : mon mot de passe en clair pour l'installation ; à changer dès l'ouverture de session (ex : ME_DEFAULT_PASSWORD=lubuntu)
  • EMBED_PACKETS : liste des logiciels qui seront installés (SSH sera automatiquement ajouté) (ex : EMBED_PACKETS=' ')
  • EMBED_VNC : indique si VNC sera non installé / installé (0/1) (ex : EMBED_VNC=1)
  • UPDATE_OS : indique si on occulte / fait la MAJ OS (0/1) (ex : UPDATE_OS=1)
  • INSTALL_APP_LANG : indique si on occulte / installe le support de langues pour les applications (0/1) (ex : INSTALL_APP_LANG=1)

Installer le support

Exécuter :

sudo ./luc_onetouch_install.sh

Utiliser la configuration rapide

Exécuter :

sudo ./luc_onetouch_install.sh DEV ISO
  • DEV est un support entier et est nécessairement le 1er paramètre
  • ISO (optionnel) est le chemin de l'ISO et est nécessairement le 2ème paramètre

Cette configuration rapide permet de ne pas modifier le script pour ces paramètres.

Modifier vos mots de passe

Une fois le Live USB démarré et opérationnel, n'oubliez pas de modifier sur le PC-LIVE :

  • Mot de passe de session :
    passwd
  • Mot de passe de VNC (si vous l'avez installé) :
    x11vnc -storepasswd

Les outils

Des alias ont été ajoutés au profil de l'utilisateur final (vous) dans le fichier ~/.bahsrc ; ils ciblent des fichier du dossier externe /cdrom.

Les outils :

  • luc_edit_runme1st : édite le script /cdrom/scripts/runme1st_from_ext.sh
  • luc_edit_syslinux : édite la configuration /cdrom/syslinux/syslinux.cfg
  • luc_reset : (attention : contenu de la persistance perdu) réinitialise la partition casper-rw (/cdrom/scripts/reset.sh) ; redémarrage nécessaire avec le mot de passe configuré dans ME_DEFAULT_PASSWORD

Le code

Si vous avez des commentaires, remarqué des erreurs ou adapté le script à d'autres distributions, n'hésitez pas à faire un retour sur le forum.

Le script luc_onetouch_install.sh (n'oubliez pas de configurer)

luc_onetouch_install.sh
#!/bin/bash
 
# LUBUNTU USB CREATOR aka LUC (run as sudo only)
# Up to date version : https://doc.ubuntu-fr.org/tutoriel/lubuntu_usb_creator
# v1.4 lnj 22/04/2015
 
# USAGE : luc_onetouch_install.sh [DEV [ISO]]
# Where optional DEV is device disk (not a partition) and optional ISO an ISO file.
 
# Supported versions : https://doc.ubuntu-fr.org/tutoriel/lubuntu_usb_creator?do=edit&rev=0#plateformes_supportees
 
# History : 
#	- v1.4 lnj 22/04/2015 : adding needed dependency
#	- v1.3 lnj 15/04/2015 : adding needed dependency squashfs-tools  
#	- v1.2 lnj 12/04/2015
 
# Different links which help me :
# http://askubuntu.com/questions/397481/how-to-make-a-persistent-live-ubuntu-usb-with-more-than-4gb
# http://david.hautbois.free.fr/wordpress/index.php/175-how-to-customize-your-ubuntu-live-usb-stick
# http://day-to-day-stuff.blogspot.fr/2011/03/on-making-custom-ubuntu-bootable-usb.html
# more - boot process : https://wiki.archlinux.org/index.php/syslinux
# http://doc.ubuntu-fr.org/tutoriel/live_usb_install4
# http://www.linux.com/community/blogs/133-general-linux/420179-creating-a-debian-live-usb-flash-drive-with-persistence-for-non-techies
# https://help.ubuntu.com/community/USB%20Installation%20Media)
 
 
################################## CHOOSE HDD #####################################
 
# to retrieve parts and disks : http://www.labtestproject.com/using_linux/partition_hard_disk_using_fdisk_command_on_linux_fedora_system
# lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,MOUNTPOINT
 
 
################################ STATIC SETTINGS ##################################
 
# ------------------------------- FUNCTIONAL --------------------------------------
# DEV : the DEV disk used to install Live USB (not part) ; can be given from $1 arg
#	See lsblk command above to determine the target disk
#	!!! Warning: DEV data will be permanently deleted (no possible return ) !!!
# ISO : ISO file location (only absolute paths is possible) ; i.e. '/ISO/tux.iso'
# ME : my short name user 
# ME_FULL : my full name user 
# NET_ADDRESS :	static IP address wanted in my network
#	!!! Becareful : possible IP conflict with other PC, especially DHCP scope !!!
# NET_NETMASK : my network mask
# NET_GATEWAY : the accessible gateway (i.e. to join the Internet)
# NET_DNS : an accessible DNS server to allow internet browsing and apt-get jobs too
 
DEV=/dev/sde
#	!!! Warning: DEV data will be permanently deleted (no possible return ) !!!
ISO='/ISO/lubuntu-14.10-desktop-i386.iso'
ME=user
ME_FULL='User'
NET_ADDRESS=192.168.0.3
NET_NETMASK=255.255.255.0
NET_GATEWAY=192.168.0.254
NET_DNS=8.8.8.8
 
# ------------------------------- PRE-CONFIGURED -----------------------------------
# USB_LABEL : partition 1 label [default : L_LUBUNTU (Live LUBUNTU)]
# USB_PART1_SIZE : size for the partition 1
#	[recommended : USB_PART1_SIZE=1G - for 1 GB, see man parted search unit]
# USB_PART2_SIZE : size for the partition 2
#	[recommended : USB_PART2_SIZE=100% - for all the remaining space] 
#	If we want a 3rd part or more, not give 100% or specify in absolute size
#	for example 10GB (see man parted and search unit)
# LIVE_USB_BOOT_MESSAGE : welcome boot message [dft : 'Lubuntu USB Live Persistant']
# LIVE_USB_BOOT_QUIET : 0/1 (0 => verbose/no splash, 1 => quiet with splash)
#	[default : 1]
# ME_DEFAULT_PASSWORD : my simple default password (change it for first logon)
#	!!! Becareful : password in clear, so give a temp simple password !!!
#	[default : lubuntu]
# EMBED_PACKETS : list of packets automatically installed at 1st boot
#	separate all packets by a space
#	i.e. EMBED_PACKETS='htop vim'
#	[default : '']
#	Nota : ssh is later included by default
# EMBED_VNC : 0/1 embed VNC for remote desktop (0 => no, 1 => yes)
#	http://adept1formatique.unblog.fr/2013/08/12/bureau-a-distance-avec-lubuntu/
#	[default : 1]
# UPDATE_OS : 0/1 update OS (take a while) (0 => no, 1 => yes)
#	[default : 1]
# INSTALL_APP_LANG : 0/1 install language for apps (take a while) (0 => no, 1 => yes)
#	[default : 1]
 
USB_LABEL=L_LUBUNTU
USB_PART1_SIZE=1G
USB_PART2_SIZE=100%
LIVE_USB_BOOT_MESSAGE='Lubuntu USB Live Persistant'
LIVE_USB_BOOT_QUIET=1
ME_DEFAULT_PASSWORD=lubuntu
#	!!! Becareful : password in clear, so give a temp simple password !!!
EMBED_PACKETS=''
EMBED_VNC=1
UPDATE_OS=1
INSTALL_APP_LANG=1
 
 
# ----------------------------------------------------------------------
 
# For future version
#
# DEFAULT_LIVE_USB_USER : default live session user
# NETWORK_MANAGER_ACTIVE : 0/1 indicate how to manage network (0 => ifup, 1 => NM)
#	[default : 0]
# LOCALE : embed locale for keyboard, live session boot and other stuff
#	[default : FR so 'locale=fr_FR.UTF-8 console-setup/layoutcode=fr'
# LANGUAGE_SUPPORT : make apps language with the right language support
#	[default : fr]
# DATE_TIME_ZONE : synchro Time Zone (http://askubuntu.com/a/594186)
#	[default : Europe/Paris]
# WAITING_REBOOT_TITLE : title to display in the terminal before reboot
#	[default : 'Patienter avant le redémarrage...']
 
DEFAULT_LIVE_USB_USER=lubuntu
NETWORK_MANAGER_ACTIVE=0
LOCALE='locale=fr_FR.UTF-8 console-setup/layoutcode=fr'
LANGUAGE_SUPPORT=fr
DATE_TIME_ZONE=Europe/Paris
WAITING_REBOOT_TITLE='Patienter avant le redémarrage...'
 
# Embed ssh to install
EMBED_PACKETS="ssh $EMBED_PACKETS"
 
# Embed VNC to install
if [ $EMBED_VNC -eq 1 ] ; then
	EMBED_PACKETS="$EMBED_PACKETS vino x11vnc"
fi
 
# Quiet or not
if [ $LIVE_USB_BOOT_QUIET -eq 1 ] ; then
	LIVE_USB_BOOT_QUIET='quiet splash'
else
	LIVE_USB_BOOT_QUIET=
fi
 
# Manage network with NM or ifup
if [ $NETWORK_MANAGER_ACTIVE -eq 1 ] ; then
	NETWORK_MANAGER_ACTIVE=
else
	NETWORK_MANAGER_ACTIVE='ip=frommedia'
fi
 
# Define customized colors : http://stackoverflow.com/a/5947802
C_red='\033[1;31m'
C_blue='\033[0;34m'
C_green='\033[0;32m'
C_yellow='\033[1;33m'
C_NC='\033[0m'
 
# Echoing all steps (usage : echof "..." [color])
# a=( "$@" ) ... ${a[1]} because ${$2} does not work (args to array)
# http://stackoverflow.com/a/18041780 + http://stackoverflow.com/a/12711837
function echof () { if [ "$2" ] ; then a=( "$@" ) ; echo -e "\n${a[1]}=> $1${C_NC}\n" ; else echo -e "\n${C_yellow}=> $1${C_NC}\n" ; fi }
 
 
############################## PROTECT DATA #############################
 
LUC_MNT=~/tmp/mnt
 
# If we give arg1 it will become DEV
if [ "$1" ] ; then
	DEV=$1
fi
 
# If we give arg2 it will become ISO
if [ "$2" ] ; then
	ISO="$2"
fi
 
# Get DISK part of DEV, so /dev/sde gives sde
DISK=`echo $DEV |sed "s/.*\/\([a-z]*\)$/\1/"`
 
# If DEV is not a real device disk
IS_DISK=`lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,MOUNTPOINT |grep ^$DISK`
if [ ! "$IS_DISK" ] ; then
	echo "Error : $DEV is not a valid disk !"
	exit 1
fi
 
# If ISO file does not exist
if [ ! -f "$ISO" ] ; then
	echo "Error : $ISO ISO file does not exist !"
	exit 2
fi
 
# Infos about selected device
echo -e "\n${C_yellow}Block device of ${C_blue}$DEV${C_NC} :"
RES=`lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,MOUNTPOINT |sed "1p;/$DISK/!d"`
echo -e "${C_green}$RES${C_NC}"
 
mkdir -p $LUC_MNT
 
# For each partition we display the partial content
for X in `echo $DEV`*
do
	if [ $X != $DEV ] ; then
		echo -e "\n${C_yellow}Partial content of ${C_blue}$X${C_NC} :"
 
		if [ "`mount |grep $X`" ] ; then
			FOLDER=`mount |grep $X |cut -f 3 -d " "`
			CONTENT=`ls -alF $FOLDER | head`
		else
			mount $X $LUC_MNT
			CONTENT=`ls -alF $LUC_MNT | head`
			umount -l $LUC_MNT
		fi
 
		echo -e "$CONTENT"
	fi
done
 
rmdir $LUC_MNT
 
# Confirm or not : http://stackoverflow.com/a/1885534
MSG="\n${C_red}You are about destroying all data from ${C_blue}$DEV${C_red}"
echo -e "$MSG (no return is possible) !${C_NC}"
read -p "Are you sure (y/[N]) ? " -r
echo
 
if [[ ! $REPLY =~ ^[y]$ ]]
then
	exit 0
fi
 
# do dangerous stuff
#echo Destroy en cours...
 
 
################################ PREPARE ################################
 
# LUC paths
LUC_PATH=~/luc
LUC_LIVEUSB_PATH=~/luc/liveusb
LUC_ISO_PATH=~/luc/iso
LUC_SQUASHFS_PATH=~/luc/squashfs
LUC_CUSTOM_SQUASHFS_PATH=~/luc/custom-squashfs
 
# Scripts and other stuff paths
SCRIPTS_PATH=$LUC_LIVEUSB_PATH/scripts
RUNME1ST_ROOT_PATH=scripts/runme1st_from_ext.sh
RUNME1ST_EXT_PATH=/cdrom/$RUNME1ST_ROOT_PATH
SYSLINUX_EXT_PATH=/cdrom/syslinux/syslinux.cfg
RESET_ROOT_PATH=scripts/reset.sh
RESET_EXT_PATH=/cdrom/$RESET_ROOT_PATH
RUNMELAST_PATH=/home/runmelast.sh
 
# Escaped string path
RUNME1ST_EXT_PATH_ESC=${RUNME1ST_EXT_PATH//\//\\\/}
RUNMELAST_PATH_ESC=${RUNMELAST_PATH//\//\\\/}
 
# debug : Start / End / exit to let start here and move end and exit
#:<<COM
#COM
#exit
 
echof "=== PREPARE LIVE USB ==="
 
echof "PREPARE > Download dependencies" 
apt-get install -y syslinux mtools parted squashfs-tools
 
echof "PREPARE > Unmount all" 
umount $DEV*
umount $LUC_ISO_PATH
umount $LUC_LIVEUSB_PATH
umount $LUC_SQUASHFS_PATH
rm -rf $LUC_PATH
 
echof "PREPARE > MBR + partitions"
# man parted : http://linux.die.net/man/8/parted
# sample : http://stackoverflow.com/questions/10519486/valid-arguments-for-parted
# 100% remaining space http://forums.gentoo.org/viewtopic-t-586478-start-0.html
echof "PREPARE > MBR MS-DOS (force to change)"
parted "$DEV" mklabel -s "msdos"
msg="PREPARE > part1 FAT32, $USB_PART1_SIZE, format FAT32, label $USB_LABEL,"
echof "$msg flag boot + lba"
parted -a cylinder "$DEV" mkpart primary fat32 1 $USB_PART1_SIZE
mkfs.vfat -n "$USB_LABEL" -I "$DEV"1 -F 32
parted "$DEV" set 1 boot on
parted "$DEV" set 1 lba on
msg="PREPARE > part2 EXT4, $USB_PART2_SIZE remaining space, format EXT4,"
echof "$msg label 'casper-rw'"
parted -a cylinder "$DEV" mkpart primary ext4 $USB_PART1_SIZE $USB_PART2_SIZE
mkfs.ext4 -L 'casper-rw' "$DEV"2
 
echof "PREPARE > Live USB Building"
 
echof "PREPARE > Live USB Building > Prepare working dir skeleton"
rm -rf $LUC_PATH
mkdir $LUC_PATH
mkdir $LUC_LIVEUSB_PATH
mkdir $LUC_ISO_PATH
mkdir $LUC_SQUASHFS_PATH
mkdir $LUC_CUSTOM_SQUASHFS_PATH
 
echof "PREPARE > Live USB Building > Mount of USB device"
mount "$DEV"1 $LUC_LIVEUSB_PATH 
 
echof "PREPARE > Live USB Building > Mount of ISO file"
mount -o loop $ISO $LUC_ISO_PATH
 
echof "PREPARE > Live USB Building > Copy all file from ISO"
# 2 errors of symlink will occur, because we can not copy symlink in FAT32 FS
rsync -aPv --exclude 'filesystem.squashfs' $LUC_ISO_PATH/ $LUC_LIVEUSB_PATH/
 
echof "PREPARE > Live USB Building > Copy of squashfs filesystem"
rsync -aPv $LUC_ISO_PATH/casper/filesystem.squashfs $LUC_PATH/
 
# Rename isolinux folder is mandatory because SYSLINUX searches in /syslinux folder (http://www.syslinux.org/wiki/index.php/SYSLINUX#How_do_I_Configure_SYSLINUX.3F)
mv $LUC_LIVEUSB_PATH/isolinux/ $LUC_LIVEUSB_PATH/syslinux
 
echof "PREPARE > Live USB Building > Create boot configuration"
cat > "$LUC_LIVEUSB_PATH/syslinux/syslinux.cfg" <<EOT 
DEFAULT live
LABEL live
  SAY $LIVE_USB_BOOT_MESSAGE
  KERNEL /casper/vmlinuz
  ## casper config : http://manpages.ubuntu.com/manpages/trusty/man7/casper.7.html
  ## - NETWORK_MANAGER_ACTIVE : indicate whether NM or ifup is used to manage network
  ##   	[default : ip=frommedia]
  ## - persistent : make persistent the "casper-rw" partition
  ## - LIVE_USB_BOOT_QUIET : display or not Lubuntu splash no verbose
  ##   	[default : quiet splash]
  ## - LOCALE : embed locale for keyboard, live session boot and other stuff
  ##   	[locale=fr_FR.UTF-8 console-setup/layoutcode=fr]
  APPEND noprompt $NETWORK_MANAGER_ACTIVE \
   persistent boot=casper initrd=/casper/initrd.lz \
   $LIVE_USB_BOOT_QUIET $LOCALE
EOT
 
# Files not used
rm $LUC_LIVEUSB_PATH/syslinux/isolinux.cfg
 
echof "PREPARE > Live USB Building > Make `echo $DEV`1 bootable"
 
# We must use gfxboot.c32 file's host (https://bugs.launchpad.net/ubuntu/+source/usb-creator/+bug/1325801/comments/11)
rsync -aPv /usr/lib/syslinux/gfxboot.c32 $LUC_LIVEUSB_PATH/syslinux/
 
# Last step to make the USB bootable (`syslinux -i dev` run too)
syslinux "$DEV"1
 
################################ CUSTOMIZE ################################
 
echof "=== CUSTOMIZE LIVE USB ==="
 
echof "CUSTOMIZE > Extract SQUASHFS filesystem"
mount -t squashfs -o loop $LUC_PATH/filesystem.squashfs $LUC_SQUASHFS_PATH
rsync -aPv $LUC_SQUASHFS_PATH/ $LUC_CUSTOM_SQUASHFS_PATH/
 
echof "CUSTOMIZE > Adding auto-trigger script on reboot"
# Entry point to execute an external script and following the execution in a terminal
echo sudo lxterminal -t "'"$WAITING_REBOOT_TITLE"'" \
	-e "bash -c \"$RUNME1ST_EXT_PATH\" &" \
	>> $LUC_CUSTOM_SQUASHFS_PATH/etc/profile
 
# Folder in which we are storing external scripts of live system
mkdir $SCRIPTS_PATH
 
echof "CUSTOMIZE > Building off auto triggered script"
bash -c "cat > $LUC_LIVEUSB_PATH/$RUNME1ST_ROOT_PATH" <<EOF1
#!/bin/bash
## Hint : alter this file in Live USB context only
 
## PRE-CONFIGURED SWITCH VARS FROM PARENT
EMBED_VNC=$EMBED_VNC
UPDATE_OS=$UPDATE_OS
INSTALL_APP_LANG=$INSTALL_APP_LANG
 
## Modifying network configuration, auto-start in boot and apply changes
## nota : due to Network Manager removing, network will not auto-start
bash -c "cat > /etc/network/interfaces" <<EOF1_1
auto lo
iface lo inet loopback
 
iface eth0 inet static
        address $NET_ADDRESS
        netmask $NET_NETMASK
        gateway $NET_GATEWAY
        dns-nameservers $NET_DNS
EOF1_1
sed -i ":a;N;s/\nexit 0/\n# Start network\nifup eth0\n&/;Ta" /etc/rc.local
ifdown eth0
ifup eth0
 
# Update is asked
if [ \$UPDATE_OS -eq 1 ] ; then
	apt-get -y update
fi
 
## Install SSH and other asked packets
apt-get -y install $EMBED_PACKETS
 
## All apps with LANGUAGE_SUPPORT is asked
## http://askubuntu.com/questions/149876/how-can-i-install-one-language-by-command-line
if [ \$INSTALL_APP_LANG -eq 1 ] ; then
	apt-get -y install \`check-language-support -l $LANGUAGE_SUPPORT\`
fi
 
## Date & Time Zone
timedatectl set-timezone $DATE_TIME_ZONE
 
## Add ME, join SUDOERS, AUTO LOGON and set DEFAULT PASSWORD
addgroup $ME
adduser --ingroup $ME --home /home/$ME --disabled-password -gecos "$ME_FULL" $ME
adduser $ME sudo
## Auto-logon : http://doc.ubuntu-fr.org/lightdm#connexion_automatique
sed -i "s/^\(autologin-user=\)$DEFAULT_LIVE_USB_USER$/\1$ME/g" \
	/etc/lightdm/lightdm.conf
bash -c "echo $ME:$ME_DEFAULT_PASSWORD | /usr/sbin/chpasswd"
 
# Embed VNC stuff
if [ \$EMBED_VNC -eq 1 ] ; then
 
	# VNC : auto enable server desktop sharing
	# http://askubuntu.com/a/530196
	gsettings set org.gnome.Vino enabled true
	gsettings set org.gnome.Vino prompt-enabled false
	gsettings set org.gnome.Vino require-encryption false
 
bash -c "cat >> /home/$ME/.profile" <<EOF1_2
 
# VNC : Activate distant desktop sharing
# src : http://adept1formatique.unblog.fr/2013/08/12/bureau-a-distance-avec-lubuntu/
# nota : x11vnc indicates that running without password is dangerous ;
# so it recommends to creating a password file (x11vnc -storepasswd)
# repeat : allow repetitive keys
# remind too : ending '&' will run this command detached from process
x11vnc -rfbauth ~/.vnc/passwd -forever -repeat -display :0 &
EOF1_2
 
fi
 
## Useful aliases
bash -c "cat >> /home/$ME/.bashrc" <<EOF1_3
 
alias luc_edit_runme1st="sudo nano $RUNME1ST_EXT_PATH"
alias luc_edit_syslinux="sudo nano $SYSLINUX_EXT_PATH"
alias luc_reset="sudo $RESET_EXT_PATH"
EOF1_3
 
## Delete first trigger
sed -i "/^sudo lxterminal -t/d" /etc/profile
 
## Adding last trigger
sed -i ":a;N;s/\nexit 0/\n$RUNMELAST_PATH_ESC&/;Ta" /etc/rc.local
 
## Last actions in session ME
## warning : this script auto delete itself in the end
bash -c "cat > $RUNMELAST_PATH" <<EOF1_4
#!/bin/bash
### Hint : alter this file in Live USB context only
 
### Definitively remove $DEFAULT_LIVE_USB_USER user/group/home/sudoers/persistance
### nota : usermod -g ... temporarily move user into my group, so I can remove it
deluser $DEFAULT_LIVE_USB_USER
usermod -g $ME $DEFAULT_LIVE_USB_USER
delgroup $DEFAULT_LIVE_USB_USER
rm -rf /home/$DEFAULT_LIVE_USB_USER
sed -i "s/^$DEFAULT_LIVE_USB_USER/$ME/g" /etc/sudoers.d/casper
sed -i "/^$DEFAULT_LIVE_USB_USER:/d" /etc/passwd
sed -i "/^$DEFAULT_LIVE_USB_USER:/d" /etc/shadow
 
### Delete my RUNMELAST trigger
sed -i "/^$RUNMELAST_PATH_ESC/d" /etc/rc.local
 
### Delete me
rm -f \\\$0
EOF1_4
 
chmod +x $RUNMELAST_PATH
 
reboot
EOF1
 
chmod +x $LUC_LIVEUSB_PATH/$RUNME1ST_ROOT_PATH
 
echof "CUSTOMIZE > Building of 'reset all' script"
bash -c "cat > $LUC_LIVEUSB_PATH/$RESET_ROOT_PATH" <<EOF4
#!/bin/bash
## Empty casper-rw partition (impossible to retrieve data)
CASPER_RW_PATH=\`mount |grep casper-rw |cut -f 3 -d " "\`
rm -rf \$CASPER_RW_PATH/*
echo "System has been reset !"
echo "Warning : the system is now incomplete, "\
"you must reboot to resolve the problem"
echo "To reboot : sudo reboot + give password"
EOF4
 
chmod +x $LUC_LIVEUSB_PATH/$RESET_ROOT_PATH
 
echof "CUSTOMIZE > Restore SQUASHFS filesystem"
mksquashfs $LUC_CUSTOM_SQUASHFS_PATH \
	$LUC_LIVEUSB_PATH/casper/filesystem.squashfs -info
 
 
################################ FINALIZE ################################
 
echof "=== FINALIZE LIVE USB ==="
 
echof "FINALIZE > Unmount and cleaning"
umount $LUC_SQUASHFS_PATH
umount $LUC_LIVEUSB_PATH
umount $LUC_ISO_PATH
rm -rf $LUC_PATH
echof "~~~ SUCCESS ! YOUR LIVE USB IS READY TO RUN ! ~~~" $C_green
unset -f echof

Mini How-To

Avant l'installation

Dans le script OneTouch, si je veux :

  • Changer la taille des partitions : voir les paramètres pré-configurés USB_PART*_SIZE
  • Ajouter d'autres partitions : ne pas donner 100% de la taille restante à USB_PART2_SIZE et utiliser un outil de partition tel GParted
  • Ajouter automatiquement des nouveaux logiciels : voir le paramètre pré-configuré EMBED_PACKETS et séparer les packets par une espace
  • Avoir tous les messages au démarrage : voir le paramètre pré-configuré LIVE_USB_BOOT_QUIET

Après l'installation

Si je veux :

  • Avoir ou pas tous les messages au démarrage : supprimer / ajouter les paramètres "quiet splash" dans le fichier {/cdrom|<racine_live_usb>}/syslinux/syslinux.cfg (selon si le Live USB est démarré ou non) ; (re)démarrer pour prendre en compte.
  • Utiliser ou pas le Network Manager au lieu de ifup : supprimer / ajouter le paramètre "ip=frommedia" dans le fichier {/cdrom|<racine_live_usb>}/syslinux/syslinux.cfg (selon si le Live USB est démarré ou non) ; (re)démarrer pour prendre en compte.
  • Modifier le script d'installation du PC-LIVE : modifier le fichier {/cdrom|<racine_live_usb>}/scripts/runme1st_from_ext.sh (selon si le Live USB est démarré ou non) ; ne pas oublier de réinitialiser (par défaut le script n'est plus déclenché après la première installation) et à (re)démarrer.
  • Réinitialiser (attention : contenu de la persistance perdu) : Live USB éteint il suffit de monter et de supprimer le contenu de la partition casper-rw, si le Live USB est démarré et a été construit avec L.U.C., il suffit d'exécuter le script sudo /cdrom/scripts/reset.sh (redémarrage nécessaire avec le mot de passe configuré dans ME_DEFAULT_PASSWORD)

Les autres OS ?

Live USB 64 bits

Je n'ai pas pu installer un Lubuntu 64 bits car je n'ai pas de processeur 64 bits à disposition.

Si quelqu'un le teste, ce serait bien qu'il fasse un retour !

Live USB autres distros

Donc, là je n'ai testé que Lubuntu. Il faudra vérifier / adapter les scripts runme1st_from_ext.sh et reset.sh qui sont dédiés à Lubuntu.

PC-BUILDER autre que Ubuntu

Si PC-BUILDER n'est par Debian like, je pense qu'il faudra tout adapter. En particulier, toutes les commandes apt-get.

PC-BUILDER sous Windows

Alors là tout est à faire :-D, mais peut être qu'en Power Shell ce n'est pas si compliqué et ça permettrait de tout scripter.

  • Créer une clé bootable avec système Live Linux (exemple)
  • Gestion MBR et partitions par script (point d'entrée)

Par contre pour les fonctionnalités squashfs, je ne suis pas sûr qu'un Windows puisse (peut être avec émulation)

Bref ! A voir !

TODO

Où vais-je ?

Je suis à 99 % satisfait du résultat.

Seul un (tout ch'ti) petit bémol : ce n'est pas pratique de trimbaler un HDD externe (je pense à l'utilisation dans le train par exemple).

Donc ce problème reste à résoudre (en même temps c'était un peu l'objectif du post ;-) ).

J'ai deux pistes :

  • les clés USB avec technologie SSD (très onéreuses 8-o )
  • les clés USB standard avec gestions différentes (comme par exemple tails)

Pistes à suivre (ou pas :) ) ?

  • Résoudre les problèmes connus
  • Etudier le processus de boot du système Live ou système normal
  • Comprendre pourquoi il faut copier gfxboot.c32 de PC-BUILDER
  • Epurer tous les fichiers dont on n'a pas besoin pour le boot, pour créér un système minimal
  • Que se passe-t-il lors d'une mise à jour du système ? Du noyau ?
  • Gestion des disques avec GPT (pour UEFI)
  • Historiser tous les affichages en plus de l'écran pendant la construction du Live USB
  • Gérer la wifi par script
  • Modifier filesystem.squashfs de manière à lui intégrer les applis et autres AVANT le 1er démarrage (chroot sur le système) : pas forcément pertinent car 1) la taille de partition 1 va grossir et donc il faudra le gérer, 2) on peut modifier in situ le script runme1st_from_ext.sh (on a déjà la rolls quoi !)
  • Multi boot ?

Problèmes connus

  • A l'ouverture de session par SSH, la sortie standard de VNC (stdout) est redirigée vers le terminal
  • Si on enlève la prise en charge ifup dans /syslinux/syslinux.cfg, la remettre ne réactivera par ifup et ce sera toujours le Network Manager qui aura le contrôle (à corriger)
  • Parfois sous Lubuntu, le bouton power n'ouvre pas la fenêtre pour éteindre / redémarrer / fermer la session

Le mot de la fin

Je tiens à remercier les nombreuses personnes qui n'ont pas hésité à passer du temps pour nous transmettre leur travail, leur passion, leurs tests, leurs découvertes, leur savoir. Je référence une partie de ces personnes en indiquant le lien source. Enfin, je remercie tout particulièrement Polo Astucien pour son étude très précise sur les mécanismes de boot d'un support. J'ai découvert que le boot est un monde en soi. Comme le disait un de mes anciens profs : "En informatique, on ouvre une porte et il y en a dix autres à explorer…"

Toute cette documentation a été élaborée en à partir de l'outil d'aperçu de https://doc.ubuntu-fr.org.

Voilou, merci de m'avoir lu et j'espère que mon travail vous sera utile.

Historique

  • v_1_2 (22/04/15) :
    • modifications mineures
  • v_1_1 (17/04/15) :
    • modifications mineures,
    • test actualisé Ubuntu 14.04 LTS 64 bits,
    • ajout de la rubrique "Systèmes supportés"
  • v_1_0 (14/04/15) : début de l'aventure ;-)

Contributeurs principaux : lenainjaune.

Version : 1.2

Date de version : 22/04/15



Le contenu de ce wiki est sous licence : CC BY-SA v3.0