Compare commits

..

14 Commits

Author SHA1 Message Date
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
16 changed files with 152 additions and 20 deletions

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.

View File

@ -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

@ -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

@ -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

View File

@ -164,6 +164,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
@ -193,6 +194,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

@ -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

@ -4,10 +4,8 @@
core_count=$(nproc --all) core_count=$(nproc --all)
# Check if nproc --all returns a numerical value greater than 2 # Check if nproc --all returns a numerical value greater than 2
if (( core_count > 1 )); then if (( core_count < 2 )); then
echo "System has more than 1 core (nproc --all: $core_count)."
else
echo "Warning: System has only $core_count core)." echo "Warning: System has only $core_count core)."
echo "The script requires at least two cores" echo "The script requires at least four cores"
exit 1 # Exit with an error code to indicate the condition is not met exit 1 # Exit with an error code to indicate the condition is not met
fi fi

View File

@ -1,7 +1,66 @@
#!/bin/bash #!/bin/bash
# Get a list of files in the directory dishes without extensions # Default values
mapfile -t dish_name < <(find "dishes/" -maxdepth 1 -type f -printf "%f\n" | sed 's/\.[^.]*$//') 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
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 # Check if there are any files
if [ ${#dish_name[@]} -eq 0 ]; then if [ ${#dish_name[@]} -eq 0 ]; then
@ -32,29 +91,31 @@ echo "You selected: $vm_name"
# virt-install command with user-defined VM name # virt-install command with user-defined VM name
virt-install \ virt-install \
--connect qemu:///system \ --connect "$uri" \
--os-variant fedora41 \ --os-variant fedora41 \
--virt-type kvm \ --virt-type kvm \
--arch x86_64 \ --arch x86_64 \
--machine q35 \ --machine q35 \
--name "$vm_name" \ --name "$vm_name" \
--boot uefi \ --boot uefi \
--cpu host-model,topology.sockets=1,topology.cores=2,topology.threads=1 \ --cpu host-model,topology.sockets=1,topology.cores=2,topology.threads=2 \
--vcpus 2 \ --vcpus 4 \
--memory 2048 \ --memory "$memory_size" \
--video virtio \ --video virtio \
--channel unix,target.type=virtio,target.name=org.qemu.guest_agent.0 \
--autoconsole none \ --autoconsole none \
--console pty,target.type=virtio \ --console pty,target.type=virtio \
--sound none \ --sound virtio \
--network type=user,model=virtio \ --network type="$network_type",model=virtio \
--controller type=virtio-serial \ --controller type=virtio-serial \
--controller type=usb,model=none \ --controller type=usb,model=none \
--controller type=scsi,model=virtio-scsi \ --controller type=scsi,model=virtio-scsi \
--input type=keyboard,bus=virtio \ --input type=keyboard,bus=virtio \
--input type=tablet,bus=virtio \ --input type=mouse,bus=virtio \
--rng /dev/urandom,model=virtio \ --rng /dev/urandom,model=virtio \
--disk path=/var/lib/libvirt/images/"$vm_name".img,format=raw,bus=virtio,cache=writeback,size=10 \ --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/ \ --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:dishes/$vm_name.cfg" --initrd-inject ./dishes/"$vm_name".cfg \
--extra-args "inst.ks=file:/$vm_name.cfg"
echo "virt-install command executed with VM name: $vm_name" echo "virt-install command executed with VM name: $vm_name"

View File

@ -6,9 +6,7 @@ total_memory=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
# Convert to MiB by dividing by 1024 (since MemTotal is in KiB) # Convert to MiB by dividing by 1024 (since MemTotal is in KiB)
total_memory_mb=$(( total_memory / 1024 )) total_memory_mb=$(( total_memory / 1024 ))
if [[ "$total_memory_mb" -lt "2048" ]]; then if [[ "$total_memory_mb" -lt "4096" ]]; then
echo "Not enough RAM: The system has only ${total_memory_mb}MiB of RAM, but at least 2048 MiB is required." echo "Not enough RAM: The system has only ${total_memory_mb}MiB of RAM, but at least 4096 is required."
exit 1 exit 1
else
echo "Sufficient memory available. System has ${total_memory_mb}MiB of RAM."
fi fi