| 127 | |
| 128 | |
| 129 | [=#disk-images] |
| 130 | == Building a Bootable Disk Images == |
| 131 | Gateworks releases disk images that can be easily flashed using the U-Boot Bootloader (see [wiki:newport#serial-ethernet here]). These disk images contain a partition table so they are tailored to the specific device size they are intended for. Additionally they are configured for a small partition size to keep flash programming time at a minimum. This requires resizing the rootfs filesystem in order to take advantage of the remaining flash space. |
| 132 | |
| 133 | Once you have a root filesystem directory/tarball and have a kernel Image you can create a compressed disk image that can be installed easily from the bootloader (see [wiki:newport#firmware-update newport/firmware-update]). |
| 134 | |
| 135 | The basic steps to create a bootable image of your Linux based OS are: |
| 136 | 1. start with the 16MB Newport [wiki:newport/boot Boot Firmware] (firmware-newport.img) |
| 137 | 1. (optional) update it's partition table if necessary: |
| 138 | - the first partition is the FAT12 partition integrated into the Boot Firmware and thus its start/end is dictated by the boot firmware itself and should not be changed. |
| 139 | - the second partition by default starts at the end of the 16MB boot firmware and extends to then end of the image |
| 140 | - the end of the image is dictated the size of the target FLASH device. The 8GB eMMC on Newport has a usable user partition size of 7264MB thus the 2nd partition can be 7264-16=7248MB |
| 141 | 1. place a [wiki:newport/bootloader#bootscript uImage bootscript] and kernel image on a bootable partition such as the FAT12 partition in the boot firmware. Alternatively your bootscript can look for the kernel wherever U-Boot can access it but typically we compress the kernel and place it into a [wiki:newport/bootloader#fit FIT image] and put it along side the bootscript. |
| 142 | 1. create a root filesystem image (using a filesystem type supported by your kernel). You can use the {{{mkfs}}} script in the Newport BSP to create ext4 and f2fs filesystem images. |
| 143 | 1. copy your filesystem image into the image file at the offset dictated by the partition table (16MB using the default partition table in firmware-newport.img) |
| 144 | 1. compress the resulting disk image (so it can fit into DRAM without slicing and reduces transfer/writing time) |
| 145 | |
| 146 | This is process made easy using scripts available in the [wiki:newport/bsp Gateworks Newport BSP]: |
| 147 | {{{#!bash |
| 148 | # define some variables |
| 149 | OUT=myimage.img |
| 150 | |
| 151 | # 1. start with firmware-newport.img |
| 152 | cp firmware-newport.img $OUT |
| 153 | |
| 154 | # 2. update it's partition table if necessary |
| 155 | # - use 'sfdisk -l -uS $OUT' to show the partition table |
| 156 | # - use 'newport/ptgen -o $OUT -p ...' to adjust partition table if desired |
| 157 | # - make sure you don't change the first partition as the start/end of that is dictated by |
| 158 | # the boot firmware |
| 159 | sfdisk -l -uS $OUT # show partition table |
| 160 | |
| 161 | # 3. create a uImage bootscript and kernel.itb and place them on FAT12 partition: |
| 162 | # - you can use the newport/ubuntu.scr as a sample bootscript which shows how to |
| 163 | # load and execute a compressed kernel in a FIT image: kernel.itb |
| 164 | # - create kernel.itb with compressed kernel image |
| 165 | # - use newport/mkits.sh to create a kernel.its template |
| 166 | # - use mkimage to create a fit image from the template |
| 167 | # - use fatfs-tool to copy the files into the FATFS filesystem within the image |
| 168 | cp linux/arch/arm64/boot/Image vmlinux |
| 169 | gzip -f vmlinux |
| 170 | ./newport/mkits.sh -o kernel.its -k vmlinux.gz -C gzip -v "Newport Kernel" |
| 171 | mkimage -f kernel.its kernel.itb |
| 172 | # inject the kernel.itb into the FAT12 filesystem |
| 173 | fatfs-tool -i $OUT cp kernel.itb / |
| 174 | # create bootscript and inect it into the FAT12 filesystem |
| 175 | mkimage -A arm64 -T script -C none -d newport/ubuntu.scr newport.scr |
| 176 | fatfs-tool -i $OUT cp newport.scr / |
| 177 | # you can use fatfs-tool to list the contents of the FAT12 and see your files |
| 178 | fatfs-tool -i $OUT ls |
| 179 | |
| 180 | # 4. create your root filesystem |
| 181 | # - you can use the newport/mkfs script to create an f2fs|ext4 fs from a set of dirs/tarballs |
| 182 | # - specify a minimum filesystem size to keep your image small in order to |
| 183 | # a) fit in SDRAM if using U-Boot tftpboot/gzwrite to update |
| 184 | # b) transfer quickly |
| 185 | # c) write less data and thus more quickly |
| 186 | # - once booted you can resize2fs for ext4 or |
| 187 | sudo ./newport/mkfs ext4 xenial-newport.ext4 1536M linux-newport.tar.xz xenial-newport.tar.xz |
| 188 | |
| 189 | # 5. copy your filesystem to the correct partition offset |
| 190 | # (16MB unless you've had reason to change it) |
| 191 | dd if=xenial-newport.ext4 of=$OUT bs=16M seek=1 |
| 192 | |
| 193 | # 6. compress it |
| 194 | # - add a '-k' flag if you want to keep around the uncompressed image to perform |
| 195 | # more maintanence on it like partition changes or FAT12 fs changes |
| 196 | gzip -f $OUT |
| 197 | }}} |
| 198 | |
| 199 | To further simplify this process, the Newport BSP Makefile has a 'ubuntu-image' make target that will do all of the above for you if you provide env variables: |
| 200 | * UBUNTU_KERNEL (uncompressed kernel Image, defaults to linux/arch/arm64/boot/Image) |
| 201 | * UBUNTU_FS (uncompressed filesystem image defaults to xenial-newport.ext4) |
| 202 | * UBUNTU_IMG (output file without the .gz extension, defaults to xenial-newport.img): |
| 203 | {{{#!bash |
| 204 | # create uncompressed root filesystem image |
| 205 | sudo ./newport/mkfs ext4 xenial-newport.ext4 1536M linux-newport.tar.xz xenial-newport.tar.xz |
| 206 | UBUNTU_KERNEL=linux/arch/arm64/boot/Image UBUNTU_FS=xenial-newport.ext4 UBUNTU_IMG=myimage make ubuntu-image |
| 207 | }}} |
| 208 | |
| 209 | You can now install this using the methods described in [wiki:newport#firmware-update newport/firware-update]. For example in the bootloader: |
| 210 | {{{#!bash |
| 211 | setenv dev 0 # specify 0 for primary boot device; use mmc list to see all mmc devs |
| 212 | tftpboot ${loadaddr} myimage.img.gz && gzwrite mmc ${dev} ${loadaddr} ${filesize} |
| 213 | }}} |
| 214 | |
| 215 | If you created a filesystem that did not stretch to the partition it was installed on (as above where we created a 1536MB filesystem image to fit within a 7264M partition) you will want to resize it after booting (one time operation): |
| 216 | * ext4 filesystem booted on MMC device (resize2fs) |
| 217 | {{{#!bash |
| 218 | resize2fs /dev/mmcblk0p2 |
| 219 | }}} |
| 220 | |
| 221 | Note there is no requirement that your root filesystem be on the boot device containing the 16MB Boot Firmware. You have other options as well as long as you have a bootscript that the bootloader can find, load, and execute. For example you could choose to put your bootscript in the FAT12 filesystem and have it load a kernel from an ext4 rootfs /boot/Image directory. You could also for that matter, have another device such as a mSATA with a single ext4 filesystem (make sure the partition is flagged as bootable) with a bootscript/kernel in its / or /boot directory (as those are in the search path for boot scripts). |
| 222 | |
| 223 | To install the kernel and root filesystem on a removable block storage device see [wiki:linux/blockdev]. |