Skip to content

NoisyCoil/fedora-macos-vagrant-builder

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

89 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fedora qemu Asahi image

Builds and runs minimal Fedora qemu image that can be converted into a vagrant box
Note: Currently this image must be built on a Fedora 39 system

This can be used to rescue a Fedora Asahi Linux system from within macos



Deploying a pre-built Vagrant Box to rescue a Fedora Asahi Remix installation

Note: Although this image can be run on both macos and Fedora systems -- the main use-case is macos

Ensure this packages/plugins are installed on macos:

brew install qemu vagrant
vagrant plugin install vagrant-qemu

Ensure these package are installed on Fedora:

dnf install qemu-img qemu-system-aarch64 vagrant
vagrant plugin install vagrant-qemu

Then just run the following to download and start a Fedora 39 vagrant box:

# A Vagrantfile should go in its own directory
mkdir vagrant-fedora
cd vagrant-fedora
curl https://leifliddy.com/vagrant.sh | sh

Note: if you ever decide to remove this Vagrantbox in the future
Ensure you remove this subdirectory

[leif.liddy@m1 vagrant-fedora]$ rm -rf .vagrant/

You should now see the fedora_39 Vagrantbox installed

[leif.liddy@m1 ~]$ vagrant box list
fedora_39      (libvirt, 20231118)

So to ssh and chroot into your Fedora Asahi Remix installation (when running on macos:


./vagrant ssh
chroot.asahi

**Note:** I've encountered a few instances where `vagrant halt` didn't kill the VagrantBox -- in that case run `./vagrant kill`

**Note:** `sudo` is needed to mount the linux partitions on `macos` systems -- but it also messes with the vagrant permissions   
which means after running `sudo vagrant ...` the first time -- every subsequent `vagrant` command needs to be run with `sudo vagrant`    

The `Vagrantfile` config and `vagrant` scripts will run the sudo comands automatically (on **macos** systems  ) -- you'll just need to enter you sudo password  

**Note:** `sudo` is not needed if running on a Linux system  


You should now be chroot'd into your Fedora Asahi Remix install

Building the image

The image can be built via mkosi or via booting and installing via an iso image

Fedora Packages needed to build and run the image

dnf install arch-install-scripts bubblewrap kpartx mkosi mtools qemu-img qemu-system-aarch64

macos Packages needed to run the image

brew install qemu

Notes

  • The root password is fedora
  • Once the VM is running you can connect to it via ssh port 2222 ie ssh -l root -p 2222 m1
  • qemu-user-static is needed if building the image on a non-aarch64 system
  • This project is based on mkosi v19 which matches the current version of mkosi in the F39 repo
    https://src.fedoraproject.org/rpms/mkosi/
    However....mkosi is updated so quickly that it's difficult to keep up at times (I have several projects based on mkosi)
    I'll strive to keep things updated to the latest version supported in Fedora
    If needed, you can always install a specific version via pip
    python3 -m pip install --user git+https://github.com/systemd/mkosi.git@v19

To build the image via mkosi

# This needs to be built on a Fedora 39 system
./build.sh
# this will create the following images:
1. mkosi.output/fedora.raw
2. qemu/fedora.qcow2 (this is simply a compressed version of fedora.raw that's used with qemu)

To mount/umount/ the fedora.raw image

./build mount
./build chroot
./build umount

This is in incredibly useful feature that lets you make changes to the raw image on the fly
This will mount/chroot/umount fedora.raw to/from mnt_image/

If the event that you make changes to the raw image in this manner
run the following to generate a new fedora.qcow2 image
qemu-img convert -f raw -O qcow2 mkosi.output/fedora.raw qemu/fedora.qcow2

Use qemu to run the fedora.qcow2 image

cd qemu
./script-qemu.sh

# the script-qemu-sh script can run on either a linux or macos system
# once the image if confirmed as working on linux
# you can literally transfer the entire qemu/ directory to a macos system ane run script-qemu-sh on macos to boot the image

Create a vagrant box

Creates a vagrant box from the fedora.cow2 image produced in the previous steps

cd vagrant
./script-vagrant.sh

This script is only supported on Linux at the moment
The output will produce two files

fedora_39.box
fedora_39.json

Although you can add a vagrant box directly -- it's beter add it via the json file
To add a new vagrant box

vagrant box add fedora_39.json

To perform a Fedora installation via an iso image

Simply run the following on either a linux or macos system

git clone https://github.com/leifliddy/fedora-macos-asahi-qemu.git  
cd qemu/    
./script-qemu.sh --cdrom  
This will automatically download and boot from the latest `Fedora-Everything-netinst-aarch64` iso
To perform a graphical install, choose the 1) Start VNC option and connect a vnc client to port :5901

/local_mnt

/local_mnt is a directory located within the VM that's shared with the host system.
You can use it to transfer files to/from the VM

Rescuing a Fedora Asahi install

You obvioulsy need to run this qemu VM on an Apple Silicon mac that has Fedora Asahi Remix installed on it
Two helper scripts have been added to the qemu image
Which can help you rescue a Fedora Asahi Remix install:

/usr/local/sbin/chroot.asahi
/usr/local/sbin/umount.asahi
  1. chroot.asahi will mount the internal (Fedora) partitions under /mnt and will arch-chroot into it.
    To exit from the chroot environment, simply type ctrl+d or exit

  2. umount.asahi will unmount the internal partitions from /mnt
    /serial-connect.sh

Using vagrant.sh

vagrant.sh enforces sudo, so it's a bit more convenient then having to type 'sudo vagrant` for every command

./vagrant up       # brings up the vagrant box
./vagrant ssh      # ssh into the vagrant box
./vagrant halt     # stop the vagrant box
./vagrant reload   # restarts the vagrant box
./vagrant destroy  # destroys the vagrant box instance
./vagrant remove   # removes the vagrant box image
./vagrant kill     # kills any running instance of the vagrant box (only use if ./vagrant halt doens't work)
./vagrant console  # this let's you console into a qemu Vagrantbox to troubleshoot errors occuring at boot time
                   # run './vagrant up' and then immediately run ./vagrant console in another window
                   # to view the console

About

Builds a Fedora qemu image for aarch64

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Shell 100.0%