Ubuntu 1504 Vivid Install To F2FS Filesystem

This should let you install Ubuntu 15.04 Vivid Vervet on the F2FS filesystem without a reboot.

You have to do it this way as

1) GRUB in Ubuntu 15.04 doesnt support F2FS and

2) Ubuntu installer cannot install to F2FS.

=Prerequisites= You should have, in no particular order.

1) A temp slave disk to install Ubuntu to initially. (/dev/sdb in this example)

2) A target drive (/dev/sda in this example)

3) A USB boot stick/disk with Ubuntu 15.04 written to it to boot from. (/dev/sdc in this example)

If sdc is USB stick,

dd if=ubuntu_xxxx.iso of=/dev/sdc bs=1M

=Create Slave Image=

Boot from USB and select 'Try Ubuntu' mode

Run the GUI Installer (Ubiquity)

Manually partition the slave disk with 250Mb ext2 partition mounted as '/boot' and the rest ext4 mounted '/', with the bootloader on /dev/sdb.

Once installed, 'continue trying ubuntu'.

=Partition target drive=

Install f2fs-tools

sudo add-apt-repository universe sudo apt-get update sudo apt-get install f2fs-tools

Start GParted, ignore error 'The driver descriptor says the physical block size is 2048 bytes, but Linux says it is 512' if you get it.

Create new partition table 'msdos'

Create two partitions, first 250Mb of disk ext2 (labelled in my example 'Boot_ext2'), second rest of disk f2fs (Labelled in my example 'Root_f2fs').

Set 'flags' on the ext2 partition to 'boot'.

Ignore red exclam on the newly created f2fs.

You should now have something like this, (I actually partitioned my slave disk first in gparted so labelled it Boot and Root, the default labels from doing direct in installer will be something else)

ubuntu@ubuntu:~$ sudo blkid /dev/sdb1: LABEL="Boot" UUID="9fdca914-f565-4118-9417-c3a93fb111b0" TYPE="ext2" PARTUUID="c0b4ef0c-01" /dev/sdb2: LABEL="Root" UUID="b4dd9484-8f44-4d5e-9b69-2a9b1b3c5f08" TYPE="ext4" PARTUUID="c0b4ef0c-02" /dev/loop0: TYPE="squashfs" /dev/sdc1: UUID="2015-04-22-12-30-17-00" LABEL="Ubuntu 15.04 amd64" TYPE="iso9660" PTUUID="1cae5859" PTTYPE="dos" PARTUUID="1cae5859-01" /dev/sdc2: SEC_TYPE="msdos" UUID="2474-67AF" TYPE="vfat" PARTUUID="1cae5859-02" /dev/sda1: LABEL="Boot_ext2" UUID="9033d4ad-37a6-4af4-95e0-5871033e7495" TYPE="ext2" PARTUUID="40d2e08d-01" /dev/sda2: LABEL="Root_f2fs" UUID="80422ab9-add2-454c-9930-7ee53288705a" TYPE="f2fs" PARTUUID="40d2e08d-02"

=Mount all partitions= Go into 'Disks' and click on all four partitions to mount them (Boot,Root,Boot_ext2,Boot_f2fs) (You can do it in Nautilus [Files] too but you may well get 'No Object for DBUS interface' error and no be able to mount some.)

You should now have them mounted like this /dev/sda2 on /media/ubuntu/Root_f2fs type f2fs (rw,nosuid,nodev,relatime,background_gc=on,user_xattr,acl,active_logs=6,uhelper=udisks2) /dev/sdb2 on /media/ubuntu/Root type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2) /dev/sdb1 on /media/ubuntu/Boot type ext2 (rw,nosuid,nodev,relatime,uhelper=udisks2) /dev/sda1 on /media/ubuntu/Boot_ext2 type ext2 (rw,nosuid,nodev,relatime,uhelper=udisks2)

=Copy data from slave to target= Now you need to copy everything from slave to target, be very careful getting them the right way round! This only takes about 4 minutes.

sudo rsync -avWHAX /media/ubuntu/Boot/ /media/ubuntu/Boot_ext2/ sudo rsync -avWHAX /media/ubuntu/Root/ /media/ubuntu/Root_f2fs/

=Mount bind to target and chroot= Now mount bind the live system into the target.


 * Be careful to pick the right mounted target folders
 * Be careful to pick the correct target drive /dev/sdX the grub bootloader is going on, in this case /dev/sda

sudo mount -o bind /dev /media/ubuntu/Root_f2fs/dev sudo mount -o bind /sys /media/ubuntu/Root_f2fs/sys sudo mount -o bind /proc /media/ubuntu/Root_f2fs/proc sudo mount -o bind /media/ubuntu/Boot_ext2 /media/ubuntu/Root_f2fs/boot sudo chroot /media/ubuntu/Root_f2fs

Fixup fstab
Now you need to edit the target fstab
 * Replace both UUID's of the slave with the UUID's from the target
 * Replace 'ext4' with 'f2fs' on the root (/).
 * Replace errors=remount-ro with defaults, (be careful the f2fs options are different from other filesystems)

Original ending bit UUID=b4dd9484-8f44-4d5e-9b69-2a9b1b3c5f08 /              ext4    errors=remount-ro 0       1 UUID=9fdca914-f565-4118-9417-c3a93fb111b0 /boot          ext2    defaults        0       2
 * 1) / was on /dev/sdc2 during installation
 * 1) / was on /dev/sdc2 during installation
 * 1) /boot was on /dev/sdc1 during installation

Replacement bit UUID=80422ab9-add2-454c-9930-7ee53288705a /              f2fs    defaults 0       1 UUID=9033d4ad-37a6-4af4-95e0-5871033e7495 /boot          ext2    defaults        0       2
 * 1) / was on /dev/sdc2 during installation
 * 1) / was on /dev/sdc2 during installation
 * 1) /boot was on /dev/sdc1 during installation

Fixup initramfs and grub
This adds f2fs modules to initramfs so when system boots it can see the f2fs root.

It then installs grub to the target drive.

nano /etc/fstab echo "f2fs" >> /etc/initramfs-tools/modules update-initramfs -u grub-install /dev/sda update-grub

This should produce the below.

root@ubuntu:/# echo "f2fs" >> /etc/initramfs-tools/modules root@ubuntu:/# update-initramfs -u update-initramfs: Generating /boot/initrd.img-3.19.0-15-generic root@ubuntu:/# grub-install /dev/sda Installing for i386-pc platform. Installation finished. No error reported. root@ubuntu:/# update-grub Generating grub configuration file ... Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported. Found linux image: /boot/vmlinuz-3.19.0-15-generic Found initrd image: /boot/initrd.img-3.19.0-15-generic Found memtest86+ image: /memtest86+.elf Found memtest86+ image: /memtest86+.bin grub-probe: error: cannot find a GRUB drive for /dev/sdc1. Check your device.map. Found Ubuntu 15.04 (15.04) on /dev/sdb2 done root@ubuntu:/#

Ignore error about sdc as that is the USB stick and it will also make a superfluous entry about the slave drive (will go on any subsequent grub kernel update)

Fixups for migrating machine

 * This only applies if you are moving the drive to another machine afterwards, or making multiple machines

Fixup Hostname
Replace the slave machine hostname with target in /etc/hosts (e.g. 127.0.1.1	TARGETX) and also just the hostname in /etc/hostname

Fixup network
Remove everything from /etc/udev/rules.d/70-persistent-net.rules (otherwise network devices will not be how you expect (eth0 will be eth1 etc.)

And finally
Type Exit twice, Power off, remove USB stick and slave drive and it should boot into your new F2FS Ubuntu!

=Errors=

You probably just made an typo somewhere! There isn't much that can go wrong.

If you wonder why you are getting a ten second grub boot countdown it is because grub detected the O/S on slave drive when it generated the config. (This is because when grub only sees one OS it stops the menu coming up even when the default TIMEOUT is set to 10.) Once you have booted into the new system, just run 'sudo update-grub' to redo the menu if you wish to remedy.

=Update 7 Sept 2015=

Warning:

I created the f2fs disk for my laptop on another machine and the laptop doesn't have f2fs tools installed. I installed fs2fs-tools to format a new ssd in the laptop (just replaced optical drive with a hdd holder) I have just spent several hours with it - it spontaneously reboots after booting to just before lightdm. Turns out f2fs-tools is causing it to reset, no idea why as of yet. remove --purge solves problem, adding it back causes problem. (you can get around issue by booting in rescue mode, running failsafe X, then going to tty2 and cntrl-c'ing X, then it boots into lightdm ok, wierd)

=Update 11 Feb 2017=

Ubuntu 16.04 f2fs-tools works fine now

Ubuntu 16.04.1 LTS after updating kernel 4.4 to 4.8 with

sudo apt-get install --install-recommends xserver-xorg-hwe-16.04

This bricked machine at initramfs not being able to find a root volume 'F2FS: Cannot load CRC32 driver'

You need to add one or two crc32 modules to load with initramfs, crc32_pclmul and crc32_generic (I think with a newish Intel CPU crc32_pclmul will suffice as only module after booting that appears to be in use, the crc32_generic is just a fallback...I think.)

/etc/initramfs-tools/modules f2fs crc32_pclmul crc32_generic
 * 1) List of modules that you want to include in your initramfs.
 * 2) They will be loaded at boot time in the order below.
 * 3) Syntax:  module_name [args ...]
 * 4) You must run update-initramfs(8) to effect this change.
 * 5) Examples:
 * 6) raid1
 * 7) sd_mod
 * 1) Examples:
 * 2) raid1
 * 3) sd_mod
 * 1) sd_mod

Thus append /etc/initramfs-tools/modules as above, rebuild with 'sudo update-initramfs -u', reboot.

=Comments=