How to create a filesystem

Content



Thank you very much to Sam Nazarko. Sam created a script which can generate a fresh file system for the iMX6 Rex.

On this page you will find step-by-step instructions how to prepare a fresh file system for iMX6 Rex. I have tested Ubuntu 14.04 – trusty with Kernel 3.15. Please note, some file systems will not work with older Kernels (such Kernel 3.05).

Setup a host computer

You may need to run the Sam’s script on the latest Ubuntu. (I have tested the script on Ubuntu 14.10). You can install it into a virtual machine, e.g. VMware Player. Go to http://releases.ubuntu.com/14.10/ and download for example this image (for 64bit PC): http://releases.ubuntu.com/14.10/ubuntu-14.10-desktop-amd64.iso

Once you install the host, login, create an imx6rex directory and create a new file inside it:

cd
mkdir imx6rex
cd imx6rex
gedit imx6_fs_builder.sh

Go to the Sam’s github, click to the RAW button, Copy & Paste the script into your imx6_fs_builder.sh file. Here is an example of the script (but always get the latest one from the github):

#!/bin/bash

# i.MX6 filesystem builder for R. Feranec
# Sam Nazarko - 20141028

echo -e "i.MX6 filesystem generator"
echo -e "For best results run this on the latest Ubuntu build"

hasRefreshed=0

function checkPackage()
{
	dpkg -l | grep -q $1
	if [ $? == 0 ]
	then
		echo "Package ${1} is already installed"
	else
		echo "Package ${1} is not installed. We need to grab it"
		if [ "${hasRefreshed}" -ne 1 ]
		then
			echo "Need to update apt cache"
			echo "Please be patient"
			apt-get update > /dev/null 2>&1
                        hasRefreshed=1
		fi
		apt-get -y install ${1}
	fi
}

checkPackage "debootstrap"
checkPackage "qemu-user-static"

clear

echo -e "Please specify the distribution you would like to build. Examples:\ntrusty (Ubuntu 14.04)\nprecise (Ubuntu 12.04)\nwheezy (Debian 7.0)"
read dist

clear

echo -e "What packages would you like to install? Examples:\napache2\nopenssh-server\n\nFor a list of packages, or to properly determine the package name, Google 'packagename in ${dist}'\n\nType 'END' when you have selected all your packages"
while [ "$packagename" != "END" ]
do
	read packagename
	if [ "$packagename" != "END" ]
	then
		echo -e "Added package ${packagename}"
		packages+="${packagename} "
	fi
done

clear

if [ -d rootfs ]
then
	echo -e "Deleting old root filesystem"
fi
echo -e "Debootstrapping"
debootstrap --foreign --arch=armhf --include="${packages}" ${dist} rootfs

clear

echo -e "Using emulator to finish install"
cp /usr/bin/qemu-arm-static rootfs/usr/bin
chroot rootfs/ /debootstrap/debootstrap --second-stage
clear

echo -e "Please set a root password"
chroot rootfs/ passwd

# Clean up ARM

rm rootfs/usr/bin/qemu-arm-static

clear

echo -e "Enabling network support on eth0"
echo "
# The loopback network interface
auto lo eth0
iface lo inet loopback

# The primary network interface
iface eth0 inet dhcp" > rootfs/etc/network/interfaces
clear

echo -e "Configuring hostname, what would you like?"
read hostname
echo -e ${hostname} > rootfs/etc/hostname
clear

echo -e "Creating tarball"
TAR="root-filesystem-imx6"
cd rootfs
tar -czvf ${TAR}.tar.gz *
md5sum ${TAR}.tar.gz > ${TAR}.md5
mv ${TAR}* ../
cd ../

clear

echo -e "Build completed successfully"

Save the file. Now change the permissions:

sudo chmod +x imx6_fs_builder.sh

Generate filesystem

Run the script:

sudo ./imx6_fs_builder.sh

You will see this:
fs01
Select for example ‘trusty’ (or you can try jessie), so write:

trusty

In the next step, you can choose additional packages you would like to install:
fs02
You can try ‘openssh-server’, so write:

openssh-server
END

Now wait …..

and then choose your password:
fs03

..wait again ….

and write down a hostname (e.g. imx6rex)
fs04

Your filesystem is now ready:
fs05

Check the directory. You should see something like this:

fedevel@ubuntu:~/imx6rex$ ls -la
total 102012
drwxrwxr-x  3 fedevel fedevel      4096 Nov 15 10:28 .
drwxr-xr-x 24 fedevel fedevel      4096 Nov 15 10:20 ..
-rwxrwxrwx  1 fedevel fedevel      2208 Nov 15 10:12 imx6_fs_builder.sh
-rw-r--r--  1 root    root           62 Nov 15 10:28 root-filesystem-imx6.md5
-rw-r--r--  1 root    root    104435687 Nov 15 10:28 root-filesystem-imx6.tar.gz
drwxr-xr-x 20 root    root         4096 Nov 15 10:28 rootfs
fedevel@ubuntu:~/imx6rex$

Copy the filesystem

You can now directly copy the file system to your SD card, SATA Hardrive or USB. As an example, we will use an USB memory stick.

Plug in your USB memory stick into your host. Check what /dev was assigned to it:

fedevel@ubuntu:~/imx6rex$ dmesg | tail
[96486.527939] sd 36:0:0:0: [sdb] 30869504 512-byte logical blocks: (15.8 GB/14.7 GiB)
[96486.532256] sd 36:0:0:0: [sdb] Write Protect is off
[96486.532296] sd 36:0:0:0: [sdb] Mode Sense: 23 00 00 00
[96486.535752] sd 36:0:0:0: [sdb] Write cache: disabled, read cache: disabled, doesn't support DPO or FUA
[96486.557992]  sdb: sdb1
[96486.572646] sd 36:0:0:0: [sdb] Attached SCSI removable disk
[96487.654261] EXT4-fs (sdb1): mounting ext3 file system using the ext4 subsystem
[96487.672825] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)

Check how it is mounted:

/dev/sdb1 on /media/fedevel/16999e5b-9518-4f5a-a05d-36a191d0128d type ext3 (rw,nodev,nosuid,uhelper=udisks2)

Our USB is using /dev/sdb. Let’s umount it:

sudo umount /media/fedevel/16999e5b-9518-4f5a-a05d-36a191d0128d

Now, we will delete the existing partition and create a new one. The commands below will destroy all the data on the USB memory stick:

fedevel@ubuntu:~/imx6rex$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.25.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-30869503, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-30869503, default 30869503):

Created a new partition 1 of type 'Linux' and of size 14.7 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

fedevel@ubuntu:~/imx6rex$

Format the USB:

fedevel@ubuntu:~/imx6rex$ sudo mkfs.ext3 /dev/sdb1
mke2fs 1.42.10 (18-May-2014)
/dev/sdb1 contains a ext3 file system
        last mounted on / on Sat Nov 15 10:39:24 2014
Proceed anyway? (y,n) y
Creating filesystem with 3858432 4k blocks and 964768 inodes
Filesystem UUID: fe37cd2a-7105-43f4-b516-5b1417ece3d3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

fedevel@ubuntu:~/imx6rex$

Mount the empty USB:

sudo mkdir /media/usb
sudo mount /dev/sdb1 /media/usb/

Copy the filesystem to the USB memory stick

cd /media/usb
sudo tar -pxvzf ~/imx6rex/root-filesystem-imx6.tar.gz

Umount the USB and remove it from your host computer:

cd
sudo umount /media/usb

Test the new filesystem

Plug in the USB memory stick with your new filesystem into your iMX6 Rex board and you can test it for example with this Kernel 3.15 uImage. Do not forget, you will need to have the uImage on your SD card. Once your Kernel boots up, it will mount and use the USB (/dev/sda1) as the filesystem. You should see the login prompt on your HDMI monitor.

Connect an USB keyboard and have a fun :)