Compare commits
22 Commits
ba54075f34
...
main
Author | SHA1 | Date | |
---|---|---|---|
e1207278a3 | |||
00f40553b5 | |||
0316eff669 | |||
c458ab4b5c | |||
02f2a131bf | |||
6cfad2d5eb | |||
5c7a5713b9 | |||
63456e0e16 | |||
01326af9d8 | |||
be2f5cf7a2 | |||
66773b8e23 | |||
4bd6294efe | |||
7d9af8f39e | |||
8c1c11fda7 | |||
3fafb78838 | |||
1dfc10b5c9 | |||
6089cb118a | |||
fee6d59831 | |||
add9bd8a09 | |||
e5ec5d9380 | |||
5974968ebd | |||
bb583e20f8 |
325
README.md
325
README.md
@ -1,224 +1,193 @@
|
||||
# Phyllome OS
|
||||
# Kickstart Phyllome OS
|
||||
|
||||
Phyllome OS is a [Fedora Remix](https://fedoraproject.org/wiki/Remix) designed to leverage [hardware-assisted virtualization](https://wiki.phyllo.me/virt/lexicon#hardware-assisted-virtualization) and [paravirtualization](https://wiki.phyllo.me/virt/lexicon#paravirtualization) to make it easier to run virtualized operating systems locally.
|
||||
[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 uses the [automated kickstart installation](https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#chapter-1-introduction) method to deploy itself to a specific target computer or virtual machine.
|
||||
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.
|
||||
|
||||
> Phyllome OS is in its ***alpha*** stage of development. Expect bugs and disappointment
|
||||
|
||||
## The content of this repository
|
||||
|
||||
Each version of Phyllome OS is like a `dish` that is based on a `recipe` that lists `ingredients`, or basic building blocks for assembling Phyllome OS and other derivatives.
|
||||
|
||||
* `ingredients`🥑 🥥 🥭 🥝 🥦 🥬 🥒 🧄: Each ingredient represents a feature or a set of integrated features, such as a specific Desktop Environment
|
||||
|
||||
`cat ingredients/base-storage.cfg`
|
||||
- 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
|
||||
[...]
|
||||
# What ? This kickstart file provides a basic ext4 unencrypted partition layout for UEFI-based systems
|
||||
Enter the number of the file you want to select: 10
|
||||
You selected: virtual-desktop-hypervisor
|
||||
|
||||
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)
|
||||
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.
|
||||
|
||||
* `recipes`🧾 🧩: this directory contains recipes for deploying operating system artifacts on bare-metal, as a live system, or inside a virtual machine.
|
||||
## Repository structure
|
||||
|
||||
`cat recipes/desktop-hypervisor.cfg`
|
||||
This repository contains such files broken down as:
|
||||
|
||||
```
|
||||
# What ? This kickstart file bootstraps a desktop hypervisor.
|
||||
* `ingredients`🥑 🥥 🥭 🥝 🥦 🥬 🥒 🧄: the basic building blocks for assembling Phyllome OS and other derivatives.
|
||||
|
||||
[...]
|
||||
* `recipes`🧾 🧩: lists of ingredients to compose several editions
|
||||
|
||||
%include ../ingredients/base-fedora-repo.cfg # offical repositories for Fedora
|
||||
%include ../ingredients/base-storage.cfg # base storage
|
||||
%include ../ingredients/base.cfg # A minimal machine
|
||||
%include ../ingredients/base-desktop-gnome.cfg # A desktop environment based on GNOME Shell
|
||||
%include ../ingredients/base-desktop-virtual-machine-manager.cfg # the virtual machine manager
|
||||
%include ../ingredients/base-hypervisor.cfg # A base hypervisor
|
||||
%include ../ingredients/base-initial-setup-gnome.cfg # Includes initial-setup for GNOME Shell, allowing for the creation of a user after the first boot, as well as some basic configuration
|
||||
```
|
||||
* `dishes`🥨 🥐 🥖 🥧 🥞 🥯 🧆 🧁: read-to-consume and standalone kickstart artifacts, which can be used to deploy complete systems
|
||||
|
||||
* `dishes`🥨 🥐 🥖 🥧 🥞 🥯 🧆 🧁...: the end-product in the form of stand-alone and ready-to-consume kickstart file
|
||||
|
||||
`cat dishes/desktop-hypervisor.cfg`
|
||||
|
||||
```
|
||||
# Generated by pykickstart v3.58
|
||||
#version=DEVEL
|
||||
# Use text mode install
|
||||
text
|
||||
# Firewall configuration
|
||||
firewall --enabled --service=mdns
|
||||
# Keyboard layouts
|
||||
keyboard --xlayouts='ch (fr)'
|
||||
# System language
|
||||
lang en_US.UTF-8
|
||||
# Network information
|
||||
|
||||
[...]
|
||||
|
||||
%end
|
||||
|
||||
%packages --exclude-weakdeps
|
||||
@core
|
||||
@hardware-support
|
||||
NetworkManager-wifi
|
||||
dejavu-sans-mono-fonts
|
||||
fedora-remix-logos
|
||||
firefox
|
||||
generic-logos
|
||||
generic-release
|
||||
generic-release-common
|
||||
generic-release-notes
|
||||
gnome-backgrounds.noarch
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
guestfs-tools
|
||||
libguestfs-tools
|
||||
libusb
|
||||
libvirt
|
||||
libvirt-daemon-config-network
|
||||
libvirt-daemon-kvm
|
||||
mesa-dri-drivers
|
||||
mozilla-ublock-origin.noarch
|
||||
nano
|
||||
pciutils
|
||||
python3-libguestfs
|
||||
qemu-kvm
|
||||
usbutils
|
||||
virt-install
|
||||
virt-manager
|
||||
virt-top
|
||||
wget
|
||||
wpa_supplicant
|
||||
-fedora-logos
|
||||
-fedora-release
|
||||
-fedora-release-common
|
||||
-fedora-release-identity-basic
|
||||
-fedora-release-notes
|
||||
-gnome-tour
|
||||
|
||||
%end
|
||||
```
|
||||
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
|
||||
|
||||
Let's assume you wish to add [Luanti](https://www.luanti.org/), a free and open-source sandbox video game engine, as an ingredient to a dish.
|
||||
Using a pull request, you can suggest a modification to an existing ingredient or create a new ingredient from scratch.
|
||||
|
||||
* Clone this repository and change directory:
|
||||
### 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
|
||||
|
||||
```
|
||||
$ git clone https://git.phyllo.me/roots/phyllomeos && cd phyllomeos
|
||||
echo "%packages --exclude-weakdeps # Beginning of the package section. Does not include weak dependencies
|
||||
|
||||
luanti # Multiplayer infinite-world block sandbox with survival mode
|
||||
|
||||
%end # End of the packages section" > ingredients/extra-luanti.cfg
|
||||
```
|
||||
|
||||
* Make a copy of the `template.cfg` file and rename it
|
||||
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 ingredients/template.cfg ingredients/extra-luanti.cfg
|
||||
cp recipes/virtual-desktop.cfg recipes/virtual-desktop-luanti.cfg
|
||||
```
|
||||
|
||||
* Add software `luanti` to your file:
|
||||
- Add the extra ingredient to the new recipe:
|
||||
|
||||
```
|
||||
$ nano ingredients/extra-luanti.cfg
|
||||
```
|
||||
echo "%include ../ingredients/extra-luanti.cfg # Sandbox video game engine" >> recipes/virtual-desktop-luanti.cfg
|
||||
```
|
||||
|
||||
```
|
||||
# What ? This partial kickstart file provides the video game Luanti
|
||||
#### Flatten
|
||||
|
||||
%packages --exclude-weakdeps # Beginning of the packages section. Excludes weak package dependencies
|
||||
|
||||
luanti # a free and open-source sandbox video game
|
||||
|
||||
%end
|
||||
```
|
||||
|
||||
* Navigate inside the `recipes` folder:
|
||||
- Prepare the dish by following the recipe, a process called 'flattening'
|
||||
|
||||
```
|
||||
$ cd recipes
|
||||
```
|
||||
|
||||
* Pick a suitable recipe to add your ingredient to it. As luanti is a GUI application, `virtual-desktop.cfg` is a fitting candidate. Make a copy of it.
|
||||
|
||||
```
|
||||
$ cp virtual-desktop.cfg virtual-desktop-lunanti.cfg
|
||||
```
|
||||
|
||||
* Edit the file and add the newly defined ingredient:
|
||||
|
||||
```
|
||||
$ nano virtual-desktop-luanti.cfg
|
||||
```
|
||||
|
||||
```
|
||||
%include ../ingredients/base-fedora-repo.cfg # offical repositories for Fedora
|
||||
%include ../ingredients/base-storage.cfg # base storage
|
||||
%include ../ingredients/base.cfg # A minimal machine
|
||||
%include ../ingredients/base-desktop-gnome.cfg # A desktop environment
|
||||
%include ../ingredients/base-guest-agents.cfg # Guest agents
|
||||
%include ../ingredients/base-initial-setup-gnome.cfg # Includes initial-setup for GNOME Shell, allowing for the creation of a user after the first boot, as well as some basic configuration
|
||||
|
||||
%include ../ingredients/extra-luanti.cfg # A free and open-source sandbox video game
|
||||
|
||||
poweroff # Shut down the system after a successful installation
|
||||
```
|
||||
|
||||
* Merge the kickstart basic building blocks a single file, or dish. This process is called 'flattening'.
|
||||
|
||||
```
|
||||
$ ksflatten -c virtual-desktop-lunanti.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 multiple dishes are affected by your ingredients, flatten them all while in the `recipes` folder.
|
||||
It is time to test the new dish!
|
||||
|
||||
#### Kickstart
|
||||
|
||||
- Make the `deploy-vm.sh` script executable
|
||||
|
||||
```
|
||||
chmod +x deploy-vm.sh
|
||||
```
|
||||
|
||||
- Execute the script
|
||||
|
||||
```
|
||||
./deploy-vm.sh
|
||||
```
|
||||
|
||||
- Select the new dish, *virtual-desktop-luanti*
|
||||
|
||||
```
|
||||
[...]
|
||||
Available files:
|
||||
1. desktop-hypervisor-amdcpu
|
||||
[...]
|
||||
14. virtual-desktop-luanti
|
||||
```
|
||||
|
||||
- When the installation is done, the machine will shut down
|
||||
|
||||
- Start it again, and ensure that Luanti has correctly been installed
|
||||
|
||||
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
|
||||
|
||||
If multiple dishes are affected by your ingredient, you can flatten them all
|
||||
|
||||
- Navigate to the recipes' directory
|
||||
|
||||
```
|
||||
cd recipes
|
||||
```
|
||||
|
||||
- Then use the following
|
||||
|
||||
```
|
||||
for filename in *.cfg; do ksflatten -c "$filename" -o "../dishes/$filename"; done
|
||||
```
|
||||
|
||||
* Navigate inside the `dishes` folder:
|
||||
The following message can safetly be ignored:
|
||||
|
||||
```
|
||||
$ cd ../dishes/
|
||||
```
|
||||
|
||||
* You can then kickstart your own installation:
|
||||
|
||||
```
|
||||
# virt-install \
|
||||
--connect qemu:///system \
|
||||
--metadata description="Phyllome OS Desktop, virtual edition, with Luanti" \
|
||||
--os-variant fedora41 \
|
||||
--virt-type kvm \
|
||||
--arch x86_64 \
|
||||
--machine q35 \
|
||||
--name virtual-desktop-luanti \
|
||||
--boot uefi \
|
||||
--cpu host-model,topology.sockets=1,topology.cores=2,topology.threads=1 \
|
||||
--vcpus 2 \
|
||||
--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-phyllome-desktop.img,format=raw,bus=virtio,cache=writeback,size=5 \
|
||||
--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"
|
||||
/usr/lib/python3.13/site-packages/pykickstart/commands/partition.py:461: KickstartParseWarning: A partition with the mountpoint / has already been defined.
|
||||
```
|
||||
|
||||
## Acknowledgement
|
||||
|
26
deploy-vm.sh
Executable file
26
deploy-vm.sh
Executable 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."
|
@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
|
||||
|
||||
%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.
|
||||
|
||||
@ -265,6 +265,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -299,6 +300,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
|
||||
|
||||
%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.
|
||||
|
||||
@ -275,6 +275,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -309,6 +310,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -223,7 +223,7 @@ mkdir /mnt/sysimage/var/lib/libvirt/isos # Create a directory to store iso image
|
||||
|
||||
%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.
|
||||
|
||||
@ -265,6 +265,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -299,6 +300,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -257,6 +257,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -291,6 +292,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
224
dishes/desktop.cfg
Normal file
224
dishes/desktop.cfg
Normal 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
|
@ -317,6 +317,7 @@ generic-release-notes
|
||||
glibc
|
||||
glibc-all-langpacks
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -354,6 +355,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -224,6 +224,7 @@ generic-release-notes
|
||||
glibc
|
||||
glibc-all-langpacks
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -256,6 +257,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -250,6 +250,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -274,6 +275,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -157,6 +157,7 @@ generic-release-common
|
||||
generic-release-notes
|
||||
glibc
|
||||
gnome-backgrounds.noarch
|
||||
gnome-control-center
|
||||
gnome-initial-setup
|
||||
gnome-shell
|
||||
gnome-terminal
|
||||
@ -176,6 +177,9 @@ openssh-clients
|
||||
openssh-server
|
||||
parted
|
||||
pciutils
|
||||
pipewire-alsa
|
||||
pipewire-jack-audio-connection-kit
|
||||
pipewire-pulseaudio
|
||||
plymouth
|
||||
policycoreutils
|
||||
prefixdevname
|
||||
|
@ -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-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
|
||||
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
|
||||
@ -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
|
||||
firefox # Internet browser
|
||||
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
|
||||
|
||||
|
@ -63,7 +63,7 @@
|
||||
# Documentation: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#chapter-9-package-selection
|
||||
|
||||
# Pre- and post-installation sections
|
||||
# Optional
|
||||
# Optional
|
||||
# All options can be picked
|
||||
# %include ../ingredients/pre.cfg # Triggered just after the kickstart file has been parsed
|
||||
# Documentation: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#chapter-4-pre-installation-script
|
||||
@ -82,7 +82,7 @@
|
||||
# %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
|
||||
|
||||
# A GNOME Shell-based desktop environment.
|
||||
# A GNOME Shell-based desktop environment
|
||||
# Optional
|
||||
# %include ../ingredients/base-desktop-gnome.cfg # A GNOME Shell-based desktop environment
|
||||
# Documentation: https://fedoraproject.org/wiki/InitialSetup
|
23
recipes/desktop.cfg
Normal file
23
recipes/desktop.cfg
Normal 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
|
13
scripts/core-count.sh
Executable file
13
scripts/core-count.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/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 "System has more than 2 core (nproc --all: $core_count)."
|
||||
else
|
||||
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
|
122
scripts/deploy-distro.sh
Executable file
122
scripts/deploy-distro.sh
Executable file
@ -0,0 +1,122 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Default values
|
||||
DEFAULT_MEMORY=4096
|
||||
DEFAULT_DISK_SIZE=10
|
||||
|
||||
# Prompt user for VM memory size
|
||||
read -r -p "Provide memory desired VM memory in MB or press Enter to keep default value of $DEFAULT_MEMORY): " 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."
|
||||
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: " 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
|
||||
|
||||
# Define URI options for qemu
|
||||
uri_options=("qemu:///system" "qemu:///session")
|
||||
|
||||
# Prompt user to select URI
|
||||
select uri in "${uri_options[@]}"; do
|
||||
if [[ -n "$uri" ]]; then
|
||||
break # Exit the select loop if a valid option is chosen
|
||||
else
|
||||
echo "Invalid selection. Please choose a valid URI."
|
||||
fi
|
||||
done
|
||||
|
||||
case "$uri" in
|
||||
qemu:///session)
|
||||
disk_path="$HOME/.local/share/libvirt/images/"
|
||||
;;
|
||||
qemu:///system)
|
||||
disk_path="/var/lib/libvirt/images/"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid URI selected. Exiting."
|
||||
exit 1
|
||||
esac
|
||||
|
||||
case "$uri" in
|
||||
qemu:///session)
|
||||
network_type="user"
|
||||
;;
|
||||
qemu:///system)
|
||||
network_type="default"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid URI selected. Exiting."
|
||||
exit 1
|
||||
esac
|
||||
|
||||
# Get a list of files in "dishes" directory, restricted to those starting with "virtual"
|
||||
mapfile -t dish_name < <(find "dishes/" -maxdepth 1 -type f -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"
|
14
scripts/system-memory.sh
Executable file
14
scripts/system-memory.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/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
|
||||
else
|
||||
echo "Sufficient memory available. System has ${total_memory_mb}MiB of RAM."
|
||||
fi
|
Reference in New Issue
Block a user