Compare commits

..

23 Commits

Author SHA1 Message Date
b98f41512d restore variables for setting specific path and networking for session and system URI 2025-06-15 17:14:31 +02:00
8c96623ad7 make selection or URI options for qemu more robust. Allow the user to just use Enter
Only allow selection of files that starts with virtual (this script is only used to deploy virtual machine)

Reworked some comments
2025-06-15 14:32:46 +02:00
358e67a041 remove whitespace 2025-06-15 14:31:00 +02:00
3b4724cf86 Removing information to the user when script goes through. 2025-06-15 14:30:48 +02:00
684a49af14 no need to echo when it succeeds 2025-06-15 14:30:00 +02:00
e1207278a3 Add possibility to pick URI, from session to system 2025-06-08 11:51:15 +02:00
00f40553b5 Document th script 2025-06-04 20:00:08 +02:00
0316eff669 rename file 2025-05-29 17:50:29 +02:00
c458ab4b5c add ability to pick memory and disk size 2025-05-29 17:49:30 +02:00
02f2a131bf add pipewire and gnome-control-center to desktop editions 2025-05-29 17:48:59 +02:00
6cfad2d5eb move file 2025-05-29 17:48:37 +02:00
5c7a5713b9 bump hardware requirements, change default network, correct paths 2025-05-22 18:14:47 +02:00
63456e0e16 bump hardware requirements 2025-05-22 18:10:43 +02:00
01326af9d8 fix bug related to path
the extra-args should refer to the file, irrespective of its location.
2025-05-22 16:48:07 +02:00
be2f5cf7a2 rename code of conduct 2025-05-21 18:18:50 +02:00
66773b8e23 change where logs are stored 2025-05-21 17:50:58 +02:00
4bd6294efe new dish 2025-05-21 17:50:40 +02:00
7d9af8f39e rename code of conduct file for consistency 2025-05-21 17:40:51 +02:00
8c1c11fda7 add reference to the script 2025-05-21 17:36:12 +02:00
3fafb78838 new script / wrapper around virt-install 2025-05-21 17:35:57 +02:00
1dfc10b5c9 Add requirements 2025-05-19 19:59:01 +02:00
6089cb118a Add new explanation related to ingredients 2025-05-19 19:56:03 +02:00
fee6d59831 move explanation of list of ingredients into the README 2025-05-19 19:55:09 +02:00
18 changed files with 577 additions and 53 deletions

145
README.md
View File

@ -2,6 +2,41 @@
[Phyllome OS](https://wiki.phyllo.me/phyllomeos/context) uses the [kickstart installation method](https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#chapter-1-introduction) to deploy itself to a specific target computer or virtual machine by means of kickstart files. [Phyllome OS](https://wiki.phyllo.me/phyllomeos/context) uses the [kickstart installation method](https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#chapter-1-introduction) to deploy itself to a specific target computer or virtual machine by means of kickstart files.
Provided that some dependencies are met (`libvirt` is running on your computer, QEMU is installed, etc), one could run the following script to deploy virtual machines, including Phyllome OS itself.
- Make the script executable:
```
chmod +x deploy-vm.sh
```
- Execute it and pick `virtual-desktop-hypervisor` when prompted:
```
./deploy-vm.sh
Executing: ./scripts/core-count.sh
System has more than 2 core (nproc --all: 6).
[...]
10. virtual-desktop-hypervisor
[...]
Enter the number of the file you want to select: 10
You selected: virtual-desktop-hypervisor
Starting install...
Retrieving 'vmlinuz' | 16 MB 00:00:00
Retrieving 'initrd.img' | 161 MB 00:00:05
Allocating 'virtinst-n0km88yy-vmlinuz' | 16 MB 00:00:00
Transferring 'virtinst-n0km88yy-vmlinuz' | 16 MB 00:00:00
Allocating 'virtinst-qxr2jxcb-initrd.img' | 161 MB 00:00:00
Transferring 'virtinst-qxr2jxcb-initrd.img' | 161 MB 00:00:00
Allocating 'virtual-desktop-hypervisor.img' | 10 GB 00:00:00
Creating domain...
```
After a successfull installation, the virtual machine will shutdown and be ready to use when powered on again.
## Repository structure
This repository contains such files broken down as: This repository contains such files broken down as:
* `ingredients`🥑 🥥 🥭 🥝 🥦 🥬 🥒 🧄: the basic building blocks for assembling Phyllome OS and other derivatives. * `ingredients`🥑 🥥 🥭 🥝 🥦 🥬 🥒 🧄: the basic building blocks for assembling Phyllome OS and other derivatives.
@ -10,11 +45,22 @@ This repository contains such files broken down as:
* `dishes`🥨 🥐 🥖 🥧 🥞 🥯 🧆 🧁: read-to-consume and standalone kickstart artifacts, which can be used to deploy complete systems * `dishes`🥨 🥐 🥖 🥧 🥞 🥯 🧆 🧁: read-to-consume and standalone kickstart artifacts, which can be used to deploy complete systems
Each ingredient represents a feature or a set of integrated features, such as a specific Desktop Environment or a storage configuration.
- Ingredients prefixed with *live* such as `live-core.cfg` are to be used with live editions only
- *core* ingredients are meant be used in all their respective recipes, *base* ingredients, recommended but optional, and extra provides more stuff (sic)
## Development ## Development
Using a pull request, you can suggest a modification to an existing ingredient or create a new ingredient from scratch. Using a pull request, you can suggest a modification to an existing ingredient or create a new ingredient from scratch.
### Example: add a new package and include it into a recipe ### Requirements
- `qemu`
- `libvirt`
- `virt-install`
- `pykickstart`
### Example 1: add a new package and include it into a recipe
- Add [Luanti](https://www.luanti.org/), a free and open-source sandbox video game engine formerly known as Minetest, as a standalone ingredient, using the `echo` command - Add [Luanti](https://www.luanti.org/), a free and open-source sandbox video game engine formerly known as Minetest, as a standalone ingredient, using the `echo` command
@ -29,7 +75,7 @@ luanti # Multiplayer infinite-world block sandbox with survival mode
Instead of creating a recipe from scratch, let's make a copy of the `virtual-desktop.cfg` recipe, which provide a Desktop environment necessary for *luanti* to function Instead of creating a recipe from scratch, let's make a copy of the `virtual-desktop.cfg` recipe, which provide a Desktop environment necessary for *luanti* to function
``` ```
$ cp recipes/virtual-desktop.cfg recipes/virtual-desktop-luanti.cfg cp recipes/virtual-desktop.cfg recipes/virtual-desktop-luanti.cfg
``` ```
- Add the extra ingredient to the new recipe: - Add the extra ingredient to the new recipe:
@ -38,53 +84,40 @@ $ cp recipes/virtual-desktop.cfg recipes/virtual-desktop-luanti.cfg
echo "%include ../ingredients/extra-luanti.cfg # Sandbox video game engine" >> recipes/virtual-desktop-luanti.cfg echo "%include ../ingredients/extra-luanti.cfg # Sandbox video game engine" >> recipes/virtual-desktop-luanti.cfg
``` ```
#### Flatten
- Prepare the dish by following the recipe, a process called 'flattening' - Prepare the dish by following the recipe, a process called 'flattening'
``` ```
$ ksflatten -c recipes/virtual-desktop-luanti.cfg -o dishes/virtual-desktop-luanti.cfg ksflatten -c recipes/virtual-desktop-luanti.cfg -o dishes/virtual-desktop-luanti.cfg
``` ```
> If any errors are detected, go back and fix them. > If any errors are detected, go back and fix them.
It is time to test the new dish! It is time to test the new dish!
- Navigate inside the `dishes` folder: #### Kickstart
- Make the `deploy-vm.sh` script executable
``` ```
$ cd dishes/ chmod +x deploy-vm.sh
``` ```
* You can then kickstart your own installation: - Execute the script
``` ```
# virt-install \ ./deploy-vm.sh
--connect qemu:///system \ ```
--metadata description="Virtual desktop with Luanti" \
--os-variant fedora41 \ - Select the new dish, *virtual-desktop-luanti*
--virt-type kvm \
--arch x86_64 \ ```
--machine q35 \ [...]
--name virtual-desktop-luanti \ Available files:
--boot uefi \ 1. desktop-hypervisor-amdcpu
--cpu host-model,topology.sockets=1,topology.cores=2,topology.threads=1 \ [...]
--vcpus 2 \ 14. virtual-desktop-luanti
--memory 4096 \
--video virtio \
--graphics spice,listen=none \
--channel spicevmc \
--autoconsole none \
--console pty,target.type=virtio \
--sound none \
--network type=user,model=virtio \
--controller type=virtio-serial \
--controller type=usb,model=none \
--controller type=scsi,model=virtio-scsi \
--input type=keyboard,bus=virtio \
--input type=tablet,bus=virtio \
--rng /dev/urandom,model=virtio \
--disk path=/var/lib/libvirt/images/virtual-desktop-luanti.img,format=raw,bus=virtio,cache=writeback,size=10 \
--location=https://download.fedoraproject.org/pub/fedora/linux/releases/42/Everything/x86_64/os/ \
--initrd-inject virtual-desktop-luanti.cfg --extra-args "inst.ks=file:virtual-desktop-luanti.cfg"
``` ```
- When the installation is done, the machine will shut down - When the installation is done, the machine will shut down
@ -93,6 +126,48 @@ $ cd dishes/
That's it ! That's it !
### Example 2: Create a new recipe from the existing list of ingredients
The file `recipes/_list-of-ingredients.cfg` can be copied and edited to create your own remix of Phyllome OS, which itself is a remix of Fedora.
```
cp recipes/_list-of-ingredients.cfg recipes/my-new-distro.cfg
```
Then edit the said file to include your favorite ingredient
```
nano recipes/my-new-distro.cfg
```
```
# __ ____ ____ _____
# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/
# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \
# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ /
# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/
# /_/ /____/
# The list of ingredients for composing Phyllome OS
# Uncomment lines with "%include" to enable ingredient
# Installation method
# Exactly one option has to be picked
# %include ../ingredients/core.cfg # Text mode
# %include ../ingredients/live-core.cfg # For live systems only
# Documentation: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#graphical-or-text-or-cmdline
# Storage configuration
# Exactly one option has to be picked
# WARNING !!! Will erase local disks!
# %include ../ingredients/core-storage.cfg # Basic ext4 partition layout for UEFI-based systems
# %include ../ingredients/live-core-storage.cfg # For live systems only
# Documentation: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#part-or-partition
[...]
```
- Once you are done, you can [flatten](#flatten) the file and [kickstart](#kickstart) it as explained in the previous section.
## FAQ ## FAQ
If multiple dishes are affected by your ingredient, you can flatten them all If multiple dishes are affected by your ingredient, you can flatten them all
@ -109,7 +184,7 @@ cd recipes
for filename in *.cfg; do ksflatten -c "$filename" -o "../dishes/$filename"; done for filename in *.cfg; do ksflatten -c "$filename" -o "../dishes/$filename"; done
``` ```
The following message can be discarded: The following message can safetly be ignored:
``` ```
/usr/lib/python3.13/site-packages/pykickstart/commands/partition.py:461: KickstartParseWarning: A partition with the mountpoint / has already been defined. /usr/lib/python3.13/site-packages/pykickstart/commands/partition.py:461: KickstartParseWarning: A partition with the mountpoint / has already been defined.

26
deploy-vm.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/bash
# Function to execute a script
execute_script() {
local script_to_execute="$1"
echo "Executing: $script_to_execute"
"$script_to_execute" || {
echo "Script failed: $script_to_execute"
return 1 # Indicate failure
}
return 0 # Indicate success
}
# Array of scripts
scripts=(
"./scripts/core-count.sh"
"./scripts/system-memory.sh"
"./scripts/deploy-distro.sh"
)
# Iterate through the scripts and execute them
for script in "${scripts[@]}"; do
execute_script "$script"
done
echo "All scripts executed."

View File

@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
%end %end
%post --nochroot --logfile=/mnt/sysimage/opt/base-hypervisor-amdcpu.log %post --nochroot --logfile=/mnt/sysimage/root/base-hypervisor-amdcpu.log
sed -i 's/\(quiet\)/\1 iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB. sed -i 's/\(quiet\)/\1 iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB.
@ -265,6 +265,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -299,6 +300,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
%end %end
%post --nochroot --logfile=/mnt/sysimage/opt/base-hypervisor-intelcpu.log %post --nochroot --logfile=/mnt/sysimage/root/base-hypervisor-intelcpu.log
sed -i 's/\(quiet\)/\1 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB. sed -i 's/\(quiet\)/\1 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB.
@ -275,6 +275,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -309,6 +310,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
%end %end
%post --nochroot --logfile=/mnt/sysimage/opt/base-hypervisor-intelcpu.log %post --nochroot --logfile=/mnt/sysimage/root/base-hypervisor-intelcpu.log
sed -i 's/\(quiet\)/\1 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB. sed -i 's/\(quiet\)/\1 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci/i' /mnt/sysimage/etc/default/grub # Load kernel modules in GRUB.
@ -265,6 +265,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -299,6 +300,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -257,6 +257,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -291,6 +292,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

224
dishes/desktop.cfg Normal file
View File

@ -0,0 +1,224 @@
# Generated by pykickstart v3.62
#version=DEVEL
# Use text mode install
text
# Firewall configuration
firewall --disabled
# Run the Setup Agent on first boot
firstboot --reconfig
# Keyboard layouts
keyboard --xlayouts='ch (fr)'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=link --hostname=phyllome-alpha --activate
# Shutdown after installation
shutdown
repo --name="fedora" --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
repo --name="updates" --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f$releasever&arch=$basearch
# Root password
rootpw --iscrypted --lock locked
# SELinux configuration
selinux --disabled
# System services
services --enabled="NetworkManager,systemd-resolved"
# System timezone
timezone Europe/Paris --utc
# Use network installation
url --mirrorlist="https://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch"
# X Window System configuration information
xconfig --defaultdesktop=GNOME --startxonboot
# System bootloader configuration
bootloader --location=mbr --timeout=1
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot/efi --fstype="efi" --size=1024 --fsoptions="umask=0077,shortname=winnt" --label=efi
part /boot --fstype="ext4" --size=512 --label=boot
part / --fstype="ext4" --grow --label=root
%post --logfile=/mnt/sysimage/root/post.log
localectl set-keymap ch-fr # Set keymap to `ch-fr`. Alternatively, `us` can be picked.
dnf update -y # Update the system
grub2-mkconfig -o /boot/grub2/grub.cfg # Unsure it is actually useful
%end
%post --nochroot --logfile=/mnt/sysimage/root/base-initial-setup-gnome.log
truncate -s 0 /mnt/sysimage/usr/share/gnome-initial-setup/vendor.conf # remove content of vendor.conf so that all options are made available
## Append lines to existing vendor.conf file, so that options are skipped upon reboot
cat >> /mnt/sysimage/usr/share/gnome-initial-setup/vendor.conf<< EOF
[pages]
skip=privacy
[goa]
providers=local-first!
EOF
%end
%post --nochroot --logfile=/mnt/sysimage/root/base-desktop-gnome.log
# cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.background.gschema.override<< EOF
# [org.gnome.desktop.background]
# picture-uri='file:///usr/share/backgrounds/elementary/Morskie Oko.jpg'
# EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.media-handling.gschema.override<< EOF
[org.gnome.desktop.media-handling]
automount-open=false
autorun-never=true
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.Terminal.gschema.override<< EOF
[org.gnome.Terminal.Legacy.Profile]
font='DejaVu Sans Mono 12'
use-system-font=false
audible-bell=false
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.wm.preferences.gschema.override<< EOF
[org.gnome.desktop.wm.preferences]
button-layout=':minimize,maximize,close'
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.a11y.gschema.override<< EOF
[org.gnome.desktop.a11y]
always-show-universal-access-status=true
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.interface.gschema.override<< EOF
[org.gnome.desktop.interface]
enable-animations=false
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.privacy.gschema.override<< EOF
[org.gnome.desktop.privacy]
remove-old-temp-files=true
remember-recent-files=false
remember-app-usage=false
disable-camera=true
disable-microphone=true
disable-sound-output=true
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.search-providers.gschema.override<< EOF
[org.gnome.desktop.search-providers]
disable-external=true
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.notifications.gschema.override<< EOF
[org.gnome.desktop.notifications.application]
enable-sound-alerts=false
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.sound.gschema.override<< EOF
[org.gnome.desktop.sound]
event-sounds=false
EOF
cat >> /mnt/sysimage/usr/share/glib-2.0/schemas/org.gnome.desktop.thumbnailers.gschema.override<< EOF
[org.gnome.desktop.thumbnailers]
disable-all=true
EOF
glib-compile-schemas /mnt/sysimage/usr/share/glib-2.0/schemas/
%end
%packages --exclude-weakdeps
NetworkManager
NetworkManager-config-connectivity-fedora
NetworkManager-wifi
alsa-sof-firmware
amd-gpu-firmware
atheros-firmware
audit
b43-fwcutter
b43-openfwwf
basesystem
bash
brcmfmac-firmware
cirrus-audio-firmware
coreutils
curl
dejavu-sans-mono-fonts
dhcp-client
dnf5
dnf5-plugins
dracut
dracut-config-rescue
e2fsprogs
fedora-remix-logos
filesystem
firefox
firewalld
fwupd
generic-logos
generic-release
generic-release-common
generic-release-notes
glibc
gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup
gnome-shell
gnome-terminal
hostname
intel-audio-firmware
intel-gpu-firmware
intel-vsc-firmware
iproute
iputils
iwlegacy-firmware
iwlwifi-dvm-firmware
iwlwifi-mvm-firmware
kbd
kernel
less
libertas-firmware
libusb
man-db
mesa-dri-drivers
mozilla-ublock-origin.noarch
mt7xxx-firmware
nano
ncurses
nvidia-gpu-firmware
nxpwireless-firmware
openssh-clients
openssh-server
parted
pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth
policycoreutils
prefixdevname
procps-ng
realtek-firmware
rootfiles
rpm
selinux-policy-targeted
setup
shadow-utils
sssd-common
sssd-kcm
sudo
systemd
systemd-resolved
tiwilink-firmware
usbutils
util-linux
vim-minimal
wget
wpa_supplicant
zram-generator-defaults
-gnome-tour
%end

View File

@ -317,6 +317,7 @@ generic-release-notes
glibc glibc
glibc-all-langpacks glibc-all-langpacks
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -354,6 +355,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -224,6 +224,7 @@ generic-release-notes
glibc glibc
glibc-all-langpacks glibc-all-langpacks
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -256,6 +257,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -250,6 +250,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -274,6 +275,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -157,6 +157,7 @@ generic-release-common
generic-release-notes generic-release-notes
glibc glibc
gnome-backgrounds.noarch gnome-backgrounds.noarch
gnome-control-center
gnome-initial-setup gnome-initial-setup
gnome-shell gnome-shell
gnome-terminal gnome-terminal
@ -176,6 +177,9 @@ openssh-clients
openssh-server openssh-server
parted parted
pciutils pciutils
pipewire-alsa
pipewire-jack-audio-connection-kit
pipewire-pulseaudio
plymouth plymouth
policycoreutils policycoreutils
prefixdevname prefixdevname

View File

@ -4,6 +4,7 @@ xconfig --startxonboot --defaultdesktop=GNOME # Start the display session on boo
gnome-shell # the version 3 of the GNOME desktop environment, without any presintalled applications gnome-shell # the version 3 of the GNOME desktop environment, without any presintalled applications
gnome-terminal # install the default terminal for GNOME Shell gnome-terminal # install the default terminal for GNOME Shell
gnome-control-center # Utilities to configure the GNOME desktop
-gnome-tour # delete GNOME Tour so it doesn't automatically launch on boot -gnome-tour # delete GNOME Tour so it doesn't automatically launch on boot
mesa-dri-drivers # add mesa drivers otherwise there is a blank screen when first booting a desktop-based kickstart without virtualization tools mesa-dri-drivers # add mesa drivers otherwise there is a blank screen when first booting a desktop-based kickstart without virtualization tools
dejavu-sans-mono-fonts # the gnome-shell package doesn't include much fonts by default, resulting in weird spacings in GNOME Terminal. GNOME Terminal unfortunately doesn't automatically pick this font dejavu-sans-mono-fonts # the gnome-shell package doesn't include much fonts by default, resulting in weird spacings in GNOME Terminal. GNOME Terminal unfortunately doesn't automatically pick this font
@ -12,6 +13,9 @@ wpa_supplicant # WPA Supplicant for Linux. It is not packaged by default in GNOM
NetworkManager-wifi # Provides the plugin to manage Wireless networking within GNOME Shell NetworkManager-wifi # Provides the plugin to manage Wireless networking within GNOME Shell
firefox # Internet browser firefox # Internet browser
mozilla-ublock-origin.noarch # An efficient ad blocker for Firefox mozilla-ublock-origin.noarch # An efficient ad blocker for Firefox
pipewire-alsa # PipeWire media server ALSA support
pipewire-pulseaudio # PipeWire PulseAudio implementation
pipewire-jack-audio-connection-kit # PipeWire JACK implementation
%end # End of the packagages section %end # End of the packagages section

View File

@ -7,19 +7,6 @@
# The list of ingredients for composing Phyllome OS # The list of ingredients for composing Phyllome OS
# Uncomment lines with "%include" to enable ingredient # Uncomment lines with "%include" to enable ingredient
Each ingredient represents a feature or a set of integrated features, such as a specific Desktop Environment or a storage configuration.
- Ingredients prefixed with live such as live-core.cfg are to be used with live editions only
- *core* ingredients are meant be used in all their respective recipes, *base* ingredients, recommended but optional, and extra, extra stuff (sic)
`cat ingredients/core-storage.cfg`
```
[...]
part /boot/efi --fstype="efi" --size=128 --fsoptions="umask=0077,shortname=winnt" --label=efi # Will create an EFI system partitition of 128 MiB (vda1)
part /boot --fstype="ext4" --size=512 --label=boot # Create a boot partition of 512 MiB using the ext4 filesystem (vda2)
part / --fstype="ext4" --grow --label=root # The remaining space will be used for root (vda3)
```
# Installation method # Installation method
# Exactly one option has to be picked # Exactly one option has to be picked
@ -95,7 +82,7 @@ part / --fstype="ext4" --grow --label=root # The remaining space will be used fo
# %include ../ingredients/core-desktop-initial-setup.cfg # Ensures that GNOME initial setup will launch on the first system start-up # %include ../ingredients/core-desktop-initial-setup.cfg # Ensures that GNOME initial setup will launch on the first system start-up
# %include ../ingredients/core-server-initial-setup.cfg # For headless systems # %include ../ingredients/core-server-initial-setup.cfg # For headless systems
# A GNOME Shell-based desktop environment. # A GNOME Shell-based desktop environment
# Optional # Optional
# %include ../ingredients/base-desktop-gnome.cfg # A GNOME Shell-based desktop environment # %include ../ingredients/base-desktop-gnome.cfg # A GNOME Shell-based desktop environment
# Documentation: https://fedoraproject.org/wiki/InitialSetup # Documentation: https://fedoraproject.org/wiki/InitialSetup

23
recipes/desktop.cfg Normal file
View File

@ -0,0 +1,23 @@
# __ ____ ____ _____
# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/
# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \
# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ /
# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/
# /_/ /____/
# A recipe for a generic desktop hypervisor
%include ../ingredients/core.cfg # Text mode
%include ../ingredients/core-storage.cfg # ext4-based storage configuration
%include ../ingredients/core-bootloader-grub.cfg # GNU GRUB
%include ../ingredients/core-locale.cfg # System locale set to Swiss French as keyboard layout and English as language
%include ../ingredients/core-security-off.cfg # Lock root account, disable firewall and SELinux
%include ../ingredients/core-services.cfg # Required systemd services
%include ../ingredients/core-network.cfg # Network configuration
%include ../ingredients/core-packages-mandatory.cfg # Mandatory packages
%include ../ingredients/core-packages-default.cfg # Default but not necessary packages
%include ../ingredients/core-packages-hardware-support.cfg # Extended hardware support
%include ../ingredients/core-fedora-repo.cfg # Offical repositories for Fedora
%include ../ingredients/core-post.cfg # Triggered after the installation
%include ../ingredients/core-initial-setup-desktop.cfg # OEM setup for GNOME Shell
%include ../ingredients/base-desktop-gnome.cfg # A GNOME Shell-based desktop environment

11
scripts/core-count.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash
# Get the core count using nproc --all
core_count=$(nproc --all)
# Check if nproc --all returns a numerical value greater than 2
if (( core_count < 2 )); then
echo "Warning: System has only $core_count core)."
echo "The script requires at least four cores"
exit 1 # Exit with an error code to indicate the condition is not met
fi

130
scripts/deploy-distro.sh Executable file
View File

@ -0,0 +1,130 @@
#!/bin/bash
# Default values
DEFAULT_MEMORY=4096
DEFAULT_DISK_SIZE=10
# Prompt user for VM memory size
read -r -p "Provide desired VM memory in MB or press Enter to keep default value of $DEFAULT_MEMORY MB): " memory_size
memory_size=${memory_size:-$DEFAULT_MEMORY}
# Validate memory size
if ! [[ "$memory_size" =~ ^[0-9]+$ ]] || (( memory_size < 2048 )); then
echo "Invalid memory size. Must be a number greater than or equal to 2048. Using default value of $DEFAULT_MEMORY MB."
memory_size=$DEFAULT_MEMORY
fi
# Prompt user for VM disk size
read -r -p "Provide desired disk size of VM in GB or press Enter to use default disk size of $DEFAULT_DISK_SIZE GB: " disk_size
disk_size=${disk_size:-$DEFAULT_DISK_SIZE}
# Validate disk size
if ! [[ "$disk_size" =~ ^[0-9]+$ ]] || (( disk_size < 10 )); then
echo "Invalid disk size. Must be a number greater than or equal to 10 GiB. Using default value of $DEFAULT_DISK_SIZE."
disk_size=$DEFAULT_DISK_SIZE
fi
# Set the choices
CHOICE_SYSTEM="qemu:///system"
CHOICE_SESSION="qemu:///session"
# Display the choices to the user
echo "Please select an option or press Enter to keep default value of $CHOICE_SESSION):"
echo "1) $CHOICE_SYSTEM (system-based or rootfull virtual machine)"
echo "2) $CHOICE_SESSION (session-based or rootless virtual machine)"
# Prompt the user for input
IFS= read -r -p "Enter your choice (1 or 2): " user_choice
# Validate the user's input
if [[ ! "$user_choice" =~ ^[12]$ ]]; then
echo "Invalid choice. Defaulting to session-based VM."
uri="$CHOICE_SESSION" # Default to session-based if input is invalid
else
# Determine the selected option
case "$user_choice" in
1)
uri="$CHOICE_SYSTEM"
;;
2)
uri="$CHOICE_SESSION"
;;
*)
echo "Unexpected error: Invalid choice. This should not happen due to validation."
exit 1
;;
esac
# Conditional variable assignment based on URI
if [[ "$uri" == "qemu:///system" ]]; then
disk_path="/var/lib/libvirt/images/"
network_type="default"
elif [[ "$uri" == "qemu:///session" ]]; then
disk_path="$HOME/.local/share/libvirt/images/"
network_type="user"
fi
fi
# Display the selected option (optional)
echo "You selected: $uri"
# Get a list of files in "dishes" directory
mapfile -t dish_name < <(find "dishes/" -maxdepth 1 -type f \( -name "virtual*" \) -printf "%f\n" | sed 's/\.[^.]*$//')
# Check if there are any files
if [ ${#dish_name[@]} -eq 0 ]; then
echo "No files found in the directory ../dishes."
exit 1
fi
# Display the files with numbered options
echo "Available files:"
for i in "${!dish_name[@]}"; do
echo "$((i + 1)). ${dish_name[$i]}"
done
# Prompt the user to select a file
read -r -p "Enter the number of the file you want to select: " choice
# Validate the user's choice
if ! [[ "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 )) || (( choice > ${#dish_name[@]} )); then
echo "Invalid choice. Please enter a number from 1 to ${#dish_name[@]}."
exit 1
fi
# Get the selected filename
vm_name="${dish_name[$((choice - 1))]}"
# Output the selected filename
echo "You selected: $vm_name"
# virt-install command with user-defined VM name
virt-install \
--connect "$uri" \
--os-variant fedora41 \
--virt-type kvm \
--arch x86_64 \
--machine q35 \
--name "$vm_name" \
--boot uefi \
--cpu host-model,topology.sockets=1,topology.cores=2,topology.threads=2 \
--vcpus 4 \
--memory "$memory_size" \
--video virtio \
--channel unix,target.type=virtio,target.name=org.qemu.guest_agent.0 \
--autoconsole none \
--console pty,target.type=virtio \
--sound virtio \
--network type="$network_type",model=virtio \
--controller type=virtio-serial \
--controller type=usb,model=none \
--controller type=scsi,model=virtio-scsi \
--input type=keyboard,bus=virtio \
--input type=mouse,bus=virtio \
--rng /dev/urandom,model=virtio \
--disk path="${disk_path}/${vm_name}.img",format=raw,bus=virtio,cache=writeback,size="$disk_size" \
--location=https://download.fedoraproject.org/pub/fedora/linux/releases/42/Everything/x86_64/os/ \
--initrd-inject ./dishes/"$vm_name".cfg \
--extra-args "inst.ks=file:/$vm_name.cfg"
echo "virt-install command executed with VM name: $vm_name"

12
scripts/system-memory.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
# Read the total memory from /proc/meminfo in MiB
total_memory=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
# Convert to MiB by dividing by 1024 (since MemTotal is in KiB)
total_memory_mb=$(( total_memory / 1024 ))
if [[ "$total_memory_mb" -lt "4096" ]]; then
echo "Not enough RAM: The system has only ${total_memory_mb}MiB of RAM, but at least 4096 is required."
exit 1
fi