Table des matières

, , , ,

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
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 !
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 :

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 :

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 :

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

Environnement complet en FR

Installer SSH et VNC

Créer votre utilisateur (vous)

Ouverture auto de session

ME=<mon_login>
sudo sed -i "s/lubuntu/$ME/g" /etc/lightdm/lightdm.conf
exit

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

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 :

Sécuriser l'échange par VNC :

Démarrage automatique de VNC :

sudo bash -c "echo x11vnc -rfbauth /home/$USER/.vnc/passwd -forever -repeat -display :0 \& >> /etc/profile"
exit

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) :

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 :

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 :

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)

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

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

Installer le support

Exécuter :

sudo ./luc_onetouch_install.sh

Utiliser la configuration rapide

Exécuter :

sudo ./luc_onetouch_install.sh DEV ISO

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 :

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 :

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 :

Après l'installation

Si je veux :

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.

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 :

Pistes à suivre (ou pas :) ) ?

Problèmes connus

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


Contributeurs principaux : lenainjaune.

Version : 1.2

Date de version : 22/04/15