diff --git a/README.md b/README.md index dcbe12d..d815306 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,98 @@ # libreticmenu +Le but de ce projet est de fournir : +* une image iso amorçable, permettant d'installer rapidement des ordinateurs basés sur Linux Mint +* un outil de configuration de ces ordinateurs qui se lance au premier démarrage +* la possibilité de relancer manuellement cet outil de configuration ultérieurement de manière à +relancer la configuration initiale ou d'autres options + + +## Création de l'image iso + +* Sur un poste linux-mint, installer le logiciel [Cubic](https://github.com/PJ-Singh-001/Cubic) : + +```bash +sudo apt-add-repository universe +sudo apt-add-repository ppa:cubic-wizard/release +sudo apt update +sudo apt install --no-install-recommends cubic +``` + +* Télécharger l'image linux mint officielle (édition cinnamon) + +* Cloner ce pojet + +```bash +git clone https://git.libretic.fr/libretic/libreticmenu.git +``` + +* Adapter le projet selon ses besoins, notamment : + * `cubic/vars/main.yml` + * `ansible/vars/main.yml` + * les templates pour cubic dans `cubic/templates` + +* Se placer dans le dossier `cubic` de ce projet et exécuter la génération des fichiers preseed qui seront utiles plus tard, et qui se trouveront dans le dossier `generated` après exécution de la commande : +```bash +cd libreticmenu/cubic +python3 -m venv preseed-venv +. preseed-venv/bin/activate +pip install ansible passlib +ansible-playbook configure-preseed.yml +``` + +* Lancer cubic et créer un nouveau dossier projet + +![Dossier de projet Cubic](doc/cubic-folder.png) + +* Paramétrage de la personnalisation de l'image ; choisir l'image linux mint téléchargée et personnalisé comme suit : + +![Écran de personnalisation de l'image](doc/original_disk_customization.png) + +* On arrive sur un shell qui permet de taper des commandes de personnalisation + +![Shell](doc/shell.png) + +* Dans ce shell, taper les commandes suivantes : + +```bash +apt install -y git python3-poetry +cd /opt +git clone https://git.libretic.fr/libretic/libreticmenu.git +cd libreticmenu +./libreticmenu.sh --cubic +``` + +* Une fois exécutées les commandes ci-dessus, passer à l'écran qui suit, qui propose de modifier la liste des packages qui doivent être supprimés dans l'image. Ne rien changer. + +* L'écran suivant propose de modifier les options de démarrage. Dans l'onglet preseed de cet écran, créer plusieurs fichiers et y copier/coller les contenus des mêmes fichiers générés par ansible : + * `libretic-nvme.ks` + * `libretic-sda.ks` + * `libretic-vda.ks` + +![L'onglet preseed une fois renseigné](doc/preseed.png) + +* Dans l'onglet Boot, remplacer les contenus des fichiers grub.cfg et live.cfg par les contenus des fichiers générés par ansible : + +![L'onglet boot une fois renseignée la zone grub.cfg](doc/boot-grub.png) + +![L'onglet boot une fois renseignée la zone live.cfg](doc/boot-live.png) + +* Les écrans suivant permettent de valider le taux de compression puis de générer l'image. + +* Une fois générée, on obtient un écran de synthèse : + +![Synthèse de l'image construite](doc/last.png) + +* Le bouton "test" permet de tester l'image obtenue, mais il est préférable de tester avec virt-manager pour une meilleure simulation de ce qu'on obtiendra après sur un ordinateur. + +* Une fois obtenu le résultat souhaité, il ne reste plus qu'à déposer l'image dans une clé usb (conseil : utiliser [Ventoy](https://www.ventoy.net)), puis amorcer un PC avec cette image. + + +## Installation d'un ordinateur avec l'image iso obtenue + + +## Utilisation du menu libreticmenu + * Pour lancer libreticmenu sans pull depuis le repo (développement) ```bash diff --git a/ansible/cubic-setup.yml b/ansible/cubic-setup.yml index 8aac5b7..1d2112c 100644 --- a/ansible/cubic-setup.yml +++ b/ansible/cubic-setup.yml @@ -1,34 +1,12 @@ # -# Ce playbook est à faire dans le modèle cubic : +# Ce playbook est à faire dans le modèle cubic # -# A ce stade, l'utilisateur d'install n'est pas créé, on ne peut pas compter sur le fait -# que son dossier d'accueil existe -# -# cd /opt -# git clone https://git.libretic.fr/libretic/libreticmenu.git -# cd libreticmenu -# ./libreticmenu.sh --cubic -# - name: Préparation de l'installation dans cubic hosts: localhost vars_files: - main.yml tasks: - - name: Sudoers pour {{ mint_install_user }} - ansible.builtin.copy: - content: | - # Autorise {{ mint_install_user }} à faire sudo sans mdp - {{ mint_install_user }} ALL = NOPASSWD:/opt/libreticmenu/libreticmenu.sh - dest: /etc/sudoers.d/{{ mint_install_user }} - - - name: Packages - ansible.builtin.apt: - name: - - ca-certificates - - python3-poetry - state: present - - name: Firstboot ansible.builtin.file: src: /opt/libreticmenu/libreticmenu-firstboot.service diff --git a/ansible/roles/base/tasks/main.yml b/ansible/roles/base/tasks/main.yml index c3c3503..8a4a6a6 100644 --- a/ansible/roles/base/tasks/main.yml +++ b/ansible/roles/base/tasks/main.yml @@ -1,3 +1,17 @@ +- name: Utilisateurs existants + ansible.builtin.getent: + database: passwd + +# Si le compte installer_username existe, c'est qu'on est passé par l'installation automatique +# On n'a pas de compte avec sudo, on doit permettre au compte installer de lancer le menu +- name: Sudoers pour {{ installer_username }} + ansible.builtin.copy: + content: | + # Autorise {{ installer_username }} à lancer le menu sans mdp + {{ installer_username }} ALL = NOPASSWD:/opt/libreticmenu/libreticmenu.sh + dest: /etc/sudoers.d/{{ installer_username }} + when: installer_username in getent_passwd.keys() + - name: Installation des packages nécessaires ansible.builtin.package: name: "{{ required_packages }}" diff --git a/ansible/vars/main.yml b/ansible/vars/main.yml index 3e5e230..f7822d6 100644 --- a/ansible/vars/main.yml +++ b/ansible/vars/main.yml @@ -1 +1 @@ -mint_install_user: installer \ No newline at end of file +installer_username: installer \ No newline at end of file diff --git a/cubic/.gitignore b/cubic/.gitignore new file mode 100644 index 0000000..d5daf12 --- /dev/null +++ b/cubic/.gitignore @@ -0,0 +1,2 @@ +generated +preseed-venv \ No newline at end of file diff --git a/cubic/configure-preseed.yml b/cubic/configure-preseed.yml new file mode 100644 index 0000000..a5d2279 --- /dev/null +++ b/cubic/configure-preseed.yml @@ -0,0 +1,34 @@ +# code: language=ansible + +- name: Configure preseed + hosts: localhost + gather_facts: false + vars_files: + - main.yml + tasks: + - name: Dossier generated + ansible.builtin.file: + path: generated + state: directory + mode: u=rwx,g=rx,o=rx + + - name: Fichiers preseed + ansible.builtin.template: + src: libretic.ks.j2 + dest: generated/libretic-{{ item.boot_entry_name }}.ks + mode: u=rw,g=r,o=r + with_items: "{{ preseed_versions }}" + vars: + diskdevice: "{{ item.diskdevice }}" + + - name: Fichier grub.cfg + ansible.builtin.template: + src: grub.cfg.j2 + dest: generated/grub.cfg + mode: u=rw,g=r,o=r + + - name: Fichier live.cfg + ansible.builtin.template: + src: live.cfg.j2 + dest: generated/live.cfg + mode: u=rw,g=r,o=r diff --git a/cubic/templates/grub.cfg.j2 b/cubic/templates/grub.cfg.j2 new file mode 100644 index 0000000..99396e8 --- /dev/null +++ b/cubic/templates/grub.cfg.j2 @@ -0,0 +1,33 @@ +loadfont unicode + +set color_normal=white/black +set color_highlight=black/light-gray + +menuentry "Linux Mint 22 Cinnamon Libretic - Live" --class linuxmint { + set gfxpayload=keep + linux /casper/vmlinuz boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash -- + initrd /casper/initrd.gz +} +menuentry "Linux Mint 22 Cinnamon Libretic - Live (compatibility mode)" { + linux /casper/vmlinuz boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} noapic noacpi nosplash irqpoll nomodeset -- + initrd /casper/initrd.gz +} +{% for item in preseed_versions %} +menuentry "Linux Mint 22 Cinnamon Libretic - Autoinstall {{ item.boot_entry_name }}" --class linuxmint { + set gfxpayload=keep + linux /casper/vmlinuz file=/cdrom/preseed/libretic-{{ item.boot_entry_name }}.ks auto=true priority=critical debian-installer/locale=fr_FR keyboard-configuration/layoutcode=fr ubiquity/reboot=casper languagechooser/language-name=French countrychooser/shortlist=FR localechooser/supported-locales=fr_FR.UTF-8 boot=casper automatic-ubiquity initrd=/casper/initrd.gz quiet splash noprompt noshell -- + initrd /casper/initrd.gz +} +{% endfor %} +grub_platform +if [ "$grub_platform" = "efi" ]; then +menuentry 'Boot from next volume' { + exit 1 +} +menuentry 'UEFI Firmware Settings' { + fwsetup +} +menuentry 'Memory test' { + linux /boot/memtest.efi +} +fi diff --git a/cubic/templates/libretic.ks.j2 b/cubic/templates/libretic.ks.j2 new file mode 100644 index 0000000..0c3220f --- /dev/null +++ b/cubic/templates/libretic.ks.j2 @@ -0,0 +1,131 @@ +#ubiquity partman-auto/method string crypto +#ubiquity partman-crypto/confirm boolean false +#ubiquity partman-crypto/passphrase password Ubuntu123 +#ubiquity partman-crypto/passphrase-again password Ubuntu123 +#ubiquity partman-crypto/warn_erase boolean true +#ubiquity partman-crypto/weak_passphrase boolean false +ubiquity ubiquity/use_nonfree boolean true + + +# Enable extras.ubuntu.com. +d-i apt-setup/extras boolean true + +# -------- Localization -------- +d-i debian-installer/locale string fr_FR.UTF-8 + +# -------- Keyboard -------- +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string fr +d-i keyboard-configuration/xkb-keymap select fr + +# -------- Network -------- +d-i netcfg/choose_interface select auto +d-i netcfg/link_wait_timeout string 10 +d-i netcfg/dhcp_timeout string 10 +d-i netcfg/dhcpv6_timeout string 1 + + +# Set default names to prevent prompts, overwritten by DHCP names. +d-i netcfg/get_hostname string unassigned-hostname +d-i netcfg/get_domain string unassigned-domain + + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +# -------- Hardware Firmware -------- +d-i hw-detect/load_firmware boolean true + +# -------- Accounts -------- +# disable root user +d-i passwd/root-login boolean false + + +# base user for system +d-i passwd/user-fullname string +d-i passwd/username string {{ installer_username }} +# Generate with "openssl passwd -6" +d-i passwd/user-password-crypted password {{ installer_password }} +d-i passwd/user-default-groups string adm audio cdrom dip lpadmin sudo plugdev sambashare video +d-i passwd/root-login boolean false +d-i user-setup/encrypt-home boolean false + +# -------- Clock and Timezone -------- +d-i clock-setup/utc boolean true +d-i clock-setup/utc-auto boolean true +d-i clock-setup/ntp boolean true +d-i time/zone string Europe/Paris + +# Partitioning +d-i partman-auto/disk string {{ diskdevice }} +d-i partman-auto/method string lvm +d-i partman-auto/purge_lvm_from_device boolean true +d-i partman-lvm/confirm boolean true +d-i partman-lvm/device_remove_lvm boolean true +d-i partman-lvm/device_remove_lvm_span boolean true + +# Pour tout mettre dans une seule partition +d-i partman-auto/choose_recipe select atomic + +d-i partman/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true + +#d-i partman-auto/init_automatically_partition select biggest_free +d-i partman/confirm_nooverwrite boolean true +d-i partman-lvm/confirm_nooverwrite boolean true +d-i partman-auto-lvm/guided_size string max + +# Set to true if you want to encrypt the first user's home directory. +d-i user-setup/encrypt-home boolean false + +# -------- Package Selection -------- +# Main tasksel server packages +tasksel tasksel/first multiselect server, openssh-server + + +# Additional packages to install +d-i pkgsel/include string openssh-server python-software-properties inotify-tools curl unattended-upgrades sysstat nmon tmux ssh vim haveged + + +# Upgrade packages after bootstrap +d-i pkgsel/upgrade select full-upgrade + + +# Install security updates automatically +d-i pkgsel/update-policy select unattended-upgrades + +# -------- Console Setup -------- + +# Verbose startup output, drop to console (text) login by default. +d-i debian-installer/quiet boolean false +d-i debian-installer/splash boolean false + +# Grub +d-i grub-installer/bootdev string {{ diskdevice }} +#d-i grub-installer/bootdev string default +d-i grub-installer/grub2_instead_of_grub_legacy boolean true +d-i grub-installer/only_debian boolean true +d-i grub-installer/timeout string 5 +d-i finish-install/reboot_in_progress note + + +# -------- Finish Installation -------- +d-i cdrom-detect/eject boolean true +d-i finish-install/reboot_in_progress note + +# Custom Commands +ubiquity ubiquity/success_command string in-target apt update;\ + +# Poweroff after install +ubiquity ubiquity/poweroff boolean true +# Reboot after install (nécessite poweroff) +ubiquity ubiquity/reboot boolean true + +# -------- Post Installation -------- + +# After system is setup (before reboot), run post-install script. +# +# This command is run just before the install finishes, but when there is +# still a usable /target directory. You can chroot to /target and use it +# directly, or use the apt-install and in-target commands to easily install diff --git a/cubic/templates/live.cfg.j2 b/cubic/templates/live.cfg.j2 new file mode 100644 index 0000000..93e41ac --- /dev/null +++ b/cubic/templates/live.cfg.j2 @@ -0,0 +1,57 @@ + +timeout 100 + +menu background splash.png +menu title Bienvenue sur Linux Mint 22 64-bit - Libretic + +menu color screen 37;40 #80ffffff #00000000 std +MENU COLOR border 30;44 #40ffffff #a0000000 std +MENU COLOR title 1;36;44 #ffffffff #a0000000 std +MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all +MENU COLOR unsel 37;44 #50ffffff #a0000000 std +MENU COLOR help 37;40 #c0ffffff #a0000000 std +MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std +MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std +MENU COLOR msg07 37;40 #90ffffff #a0000000 std +MENU COLOR tabmsg 31;40 #ffDEDEDE #00000000 std +MENU WIDTH 78 +MENU MARGIN 15 +MENU ROWS 6 +MENU VSHIFT 10 +MENU TABMSGROW 12 +MENU CMDLINEROW 12 +MENU HELPMSGROW 16 +MENU HELPMSGENDROW 29 + + +label live + menu label Linux Mint 22 Libretic - Live + menu default + kernel /casper/vmlinuz + append boot=casper initrd=/casper/initrd.gz username=mint hostname=mint quiet splash -- + +label compat + menu label Linux Mint 22 Libretic - Live (compatibility mode) + linux /casper/vmlinuz + append boot=casper initrd=/casper/initrd.gz username=mint hostname=mint noapic noacpi nosplash irqpoll nomodeset -- + +{% for item in preseed_versions %} +label libretic{{ item.boot_entry_name }} + menu label Linux Mint 22 Libretic - Autoinstall {{ item.boot_entry_name }} + kernel /casper/vmlinuz + append file=/cdrom/preseed/libretic-{{ item.boot_entry_name }}.ks auto=true priority=critical debian-installer/locale=fr_FR keyboard-configuration/layoutcode=fr ubiquity/reboot=casper languagechooser/language-name=French countrychooser/shortlist=FR localechooser/supported-locales=fr_FR.UTF-8 boot=casper automatic-ubiquity initrd=/casper/initrd.gz quiet splash noprompt noshell -- + +{% endfor %} +label hdt + menu label Hardware Detection + kernel hdt.c32 + +label local + menu label Boot from local drive + COM32 chain.c32 + APPEND hd0 + +label memtest + menu label Memory test + linux /boot/memtest.bin + diff --git a/cubic/vars/main.yml b/cubic/vars/main.yml new file mode 100644 index 0000000..57f0597 --- /dev/null +++ b/cubic/vars/main.yml @@ -0,0 +1,16 @@ +# Définit, dans le cas d'une installation automatisée, les divers types +# de disque dur pour lesquels créer une section dans le menu de démarrage +preseed_versions: + - boot_entry_name: nvme + diskdevice: /dev/nvme0n1 + - boot_entry_name: sda + diskdevice: /dev/sda + - boot_entry_name: vda + diskdevice: /dev/vda + +# Définit, dans le cas d'une installation automatisée, le nom de l'utilisateur +# non root autorisé à lancer le menu libreticmenu +installer_username: installer + +# Le mot de passe de cet utilisateur +installer_password: "{{ 'achanger' | password_hash('sha512', rounds=5000) }}" diff --git a/doc/boot-grub.png b/doc/boot-grub.png new file mode 100644 index 0000000..1419066 Binary files /dev/null and b/doc/boot-grub.png differ diff --git a/doc/boot-live.png b/doc/boot-live.png new file mode 100644 index 0000000..4997823 Binary files /dev/null and b/doc/boot-live.png differ diff --git a/doc/cubic-folder.png b/doc/cubic-folder.png new file mode 100644 index 0000000..3b92534 Binary files /dev/null and b/doc/cubic-folder.png differ diff --git a/doc/last.png b/doc/last.png new file mode 100644 index 0000000..b4287f8 Binary files /dev/null and b/doc/last.png differ diff --git a/doc/original_disk_customization.png b/doc/original_disk_customization.png new file mode 100644 index 0000000..8927266 Binary files /dev/null and b/doc/original_disk_customization.png differ diff --git a/doc/preseed.png b/doc/preseed.png new file mode 100644 index 0000000..e8a5880 Binary files /dev/null and b/doc/preseed.png differ diff --git a/doc/shell.png b/doc/shell.png new file mode 100644 index 0000000..87adc56 Binary files /dev/null and b/doc/shell.png differ