Creating a Fedora Install Image for ARM Systems
This will track the work to add ARM support to the standard Fedora installation tools (Anaconda/Lorax).
The plan is to initially use livemedia-creator to create disk images that can be stored directly on an SDCard to boot a device (e.g., Trim Slice), or booted via an ARM emulator like QEMU. Since most of these devices do not boot from standard media (CD/DVD), the ultimate goal is to be able to perform network installs via Anaconda after PXE-booting a device. Hopefully, the interim work to add ARM support and create disk images will move us closer to that goal.
Creating a Disk Image for Trim Slice
Anaconda and Lorax have been modified to recognize some common ARM systems that we are using and select the appropriate kernel for installation. The livemedia-creator tool can be run on an ARM build host to create a disk image for that target. The installation is controlled by a kickstart configuration file. The image created can be copied directly to an SDCard and used to boot the system, for systems so equipped.
A Trim Slice was used for development and testing of this process because 1) it has an easily accessible SDCard slot, 2) U-Boot is pre-installed on internal storage, so does not have to be set up on the boot media, 3) no special formatting is required for the /boot partition, and ext3 loads are supported, and 4) U-Boot is configured to automatically boot from the SDCard, if present.
The modified versions of Anaconda, Lorax, and grubby are not available from the Fedora-ARM mirrors (changes not committed to F17), so they must be installed from the F17 xpfa repo.
Set Up the Repository
From an F17 ARM system, install the xpfa repo package:
- get the eXtra Packages for Fedora ARM (xpfa) yum repository definition:
sudo yum --nogpgcheck install http://dmarlin.fedorapeople.org/packages/FedoraArm/RPMS/noarch/xpfa-17-1.noarch.rpm
- update grubby to get the modified version:
sudo yum --enablerepo=xpfa update grubby
- make any changes to the U-Boot configuration (if needed):
sudo vi /etc/sysconfig/uboot
- install Anaconda and Lorax
sudo yum --enablerepo=xpfa install anaconda lorax
Building the Image
On the target build host, log in as 'root', and perform the following steps.
- set up a kickstart file
I recommend first using the F17-trimslice.ks file as a test to make sure everything is set up and working as expected. Then use it as a base for creating other kickstart configuration files.
- run livemedia-creator
livemedia-creator \ --make-disk --no-virt --image-only --keep-image \ --ks=/root/F17-trimslice.ks
The disk image is created in
/tmp/disk<TempString>.img. When the process completes, the contents of the disk image may be examined by loop-mounting the image file.
The trimslice.ks defines three partitions:
/boot / swap
These will be mapped in order, for example:
# kpartx -av <PathToDiskImage> add map loop0p1 (253:0): 0 522240 linear /dev/loop0 2048 add map loop0p2 (253:1): 0 2621440 linear /dev/loop0 524288 add map loop0p3 (253:2): 0 1046528 linear /dev/loop0 3145728 # ls -l /dev/mapper total 0 crw------- 1 root root 10, 236 Feb 11 00:46 control lrwxrwxrwx 1 root root 7 Apr 25 18:49 loop0p1 -> ../dm-0 lrwxrwxrwx 1 root root 7 Apr 25 18:49 loop0p2 -> ../dm-1 lrwxrwxrwx 1 root root 7 Apr 25 18:49 loop0p3 -> ../dm-2 # mkdir -p /mnt/rootfs # mount -o loop /dev/dm-1 /mnt/rootfs [108293.766690] EXT4-fs (loop1): mounted filesystem with ordered data mode. Opts: (null) # mount -o loop /dev/dm-0 /mnt/rootfs/boot [108293.906412] kjournald starting. Commit interval 5 seconds [108293.906531] EXT3-fs (loop2): using internal journal [108293.906545] EXT3-fs (loop2): mounted filesystem with ordered data mode # pushd /mnt/rootfs/ /mnt/rootfs ~ # ls -l total 74 lrwxrwxrwx 1 root root 7 Apr 25 2012 bin -> usr/bin dr-xr-xr-x. 4 root root 1024 Apr 25 2012 boot drwxr-xr-x. 2 root root 4096 Apr 25 2012 dev drwxr-xr-x 68 root root 4096 Apr 25 2012 etc drwxr-xr-x 2 root root 4096 Feb 11 00:46 home lrwxrwxrwx 1 root root 7 Apr 25 2012 lib -> usr/lib drwx------. 2 root root 16384 Apr 25 2012 lost+found drwxr-xr-x 2 root root 4096 Feb 11 00:46 media drwxr-xr-x 2 root root 4096 Feb 11 00:46 mnt drwxr-xr-x 2 root root 4096 Feb 11 00:46 opt drwxr-xr-x 2 root root 4096 Apr 25 2012 proc dr-xr-x---. 2 root root 4096 Apr 25 2012 root drwxr-xr-x 14 root root 4096 Apr 25 2012 run lrwxrwxrwx 1 root root 8 Apr 25 2012 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Feb 11 00:46 srv drwxr-xr-x. 2 root root 4096 Apr 25 2012 sys drwxrwxrwt 2 root root 4096 Apr 25 2012 tmp drwxr-xr-x 12 root root 4096 Apr 25 2012 usr drwxr-xr-x 17 root root 4096 Apr 25 2012 var # ls -l boot/ total 43468 -rw------- 1 root root 1527901 Apr 15 09:36 System.map-3.3.2-2.fc17.armv7hl.tegra -rw-r--r-- 1 root root 225 Apr 25 2012 boot.cmd -rw-r--r-- 1 root root 297 Apr 25 2012 boot.scr -rw-r--r-- 1 root root 107705 Apr 15 09:36 config-3.3.2-2.fc17.armv7hl.tegra drwxr-xr-x 2 root root 1024 Apr 25 2012 grub -rw-r--r-- 1 root root 10645211 Apr 25 2012 initramfs-3.3.2-2.fc17.armv7hl.tegra.img -rw-r--r-- 1 root root 27 Apr 25 2012 klist.txt drwx------. 2 root root 12288 Apr 25 2012 lost+found -rw-r--r-- 1 root root 3578336 Apr 25 2012 uImage -rw-r--r-- 1 root root 3578336 Apr 25 2012 uImage-3.3.2-2.fc17.armv7hl.tegra -rw-r--r-- 1 root root 10645275 Apr 25 2012 uInitrd -rw-r--r-- 1 root root 10645275 Apr 25 2012 uInitrd-3.3.2-2.fc17.armv7hl.tegra -rwxr-xr-x 1 root root 3578272 Apr 15 09:36 vmlinuz-3.3.2-2.fc17.armv7hl.tegra # cat etc/system-release Fedora release 17 (Beefy Miracle) # cat etc/RELEASE F17-20120424-livemedia # popd ~ # umount /mnt/rootfs/boot # umount /mnt/rootfs # kpartx -dv <PathToDiskImage> del devmap : loop0p3 del devmap : loop0p2 del devmap : loop0p1 loop deleted : /dev/loop0
Installing the Image
This disk image is suitable to be copied directly to an SDCard. The disk image could similarly be copied to other media, but only using an SDCard has been tested. To save space and make transfers faster, I typically compress the disk image using xz.
To copy this to an SDCard from my workstation, I plugged the SDCard into a USB adapter, inserted the adapter to an open USB slot, and checked
/proc/partitions to see where it was located. For this example, assume it was located on
# cat /proc/partitions major minor #blocks name 8 0 78150744 sda 8 1 512000 sda1 8 2 77637632 sda2 8 16 7879680 sdb 8 17 7875584 sdb1
To transfer the image to the device, make sure none of the partitions on that device are mounted, for example:
# umount /dev/sdb1
Then copy the disk image to the raw device.
# xzcat <PathToCompressedDiskImage> | dd of=/dev/sdb
Once the transfer completes, the partition table will need to be rescanned and updated.
# partprobe /dev/sdb
The device partitions may then be mounted and the contents examined, or the device may be ejected and moved to test booting on the target system.