Dual boot is not enough and we want both FreeBSD and Linux to get along for the better. To this end we will discuss several aspect of making both OS recognize each other and work in parallel.
Note that this post in particular is subject to changes. These things evolve rapidly so some details may not be accurate, not up-to-date or differ from your specific setup. So please feel free to comment/update/add ideas/point out errors or missing details. Thanks!
We will look at the following aspect:
Access each other data
The first step is to recall your partition layout and what it looks like on FreeBSD and Linux. Take time to note it on a piece of paper. That’s especially useful if you have extra hard disks with additional data partitions. To recall in the previous post we had:
|Linux ‘/’ (ext4)||/dev/ada0p3||/dev/sda3|
|FreeBSD ‘/’ (UFS)||/dev/ada0p5||/dev/sda5|
FreeBSD and Linux can both access their counterpart ext4 and UFS partition. In particular, FreeBSD can also write to Linux’s ext4 partitions. Linux supports writing to UFS in theory, but I would strongly recommend against that. Last time I tested, it only completely wrecked the UFS partition and had to reformat it. In fact, I’d recommend that you mount the counterpart OS partition in read-only to avoid messing with anything. Eventually setup another shared ext4 partition that you access in writing from both Linux and FreeBSD. At least if something goes wrong, you only loose that.
As for the swap partitions, both OS can use each other partition. Linux however requires a special signature which can be created with
mkswap. However I don’t think this is still required and it works fine without it.
We will add the mount point in
/mnt, that’s as good a place as any. Of course everything below must be done as root.
Create the mount point for Linux:
We want to mount the second (Linux swap) and third (Linux ext4) partitions, that is for FreeBSD
/dev/ada0p3. Add the partitions to the end of
/dev/ada0p2 none swap sw 0 0 /dev/ada0p3 /mnt/linux ext2fs failok,ro 0 0
failok option for
/mnt/linux. It means that the FreeBSD boot should not fail if the ext4 partition fails to mount. Otherwise, if the partition was marked as dirty by Linux (for instance you did a hard reboot) and then you reboot directly into FreeBSD, mounting the ext4 partition would fail because it requires an fsck.
Create the mount point for FreeBSD:
We want to mount the fourth (FreeBSD swap) and fifth (FreeBSD UFS) partitions, that is for Linux
/dev/sda5. Add the partitions to the end of
/dev/sda4 none swap sw 0 0 /dev/sda5 /mnt/freebsd ufs nofail,ro,ufstype=ufs2 0 0
nofail similar to
failok in FreeBSD.
Now that both OS can access each other data, it’s time to see if we can put this to some use. A first thing that you might do is to share some parts of your home directory. Of course this will be read-only.
What I personally do is selecting the OS that I use most frequently. This one contains everything. Then on the other OS, I use symlinks to some part of my home directory. For instance on Linux:
/home/user/Music -> /mnt/freebsd/home/user/Music
/home/user/Pictures -> /mnt/freebsd/home/user/Pictures
/home/user/Videos -> /mnt/freebsd/home/user/Videos
Those don’t change that often when I’m on Linux, but I least I got to listen to music, watch movies and can access pictures.
Share ssh keys
If you frequently use ssh to access your laptop or rsync+ssh to sync your documents, you will soon find yourself with ssh complaining that the host key has changed on the same host. Of course FreeBSD and Linux will both have a separate set of ssh host keys. Thankfully we can use the same key on both.
Suppose that we use FreeBSD’s ssh host keys. On Linux, go into
# Remove Linux's ssh host keys rm ssh_host_*key* # Link FreeBSD's ssh host keys for key in /mnt/freebsd/etc/ssh/ssh_host_*key* do ln -s "$key" done
Don’t forget to
service ssh restart. Now you can access both Linux and FreeBSD with ssh as if it was the same host (which it is actually).
Share WPA supplicant (WiFi)
Same principle now for WPA supplicant configuration file. However it’s not as simple as it was for ssh. You see, the WPA supplicant configuration needs different options for the control socket on FreeBSD and Linux. Unfortunately,
wpa_supplicant.conf does not allow for file include. Actually it should be possible to arrange FreeBSD and Linux so that the same
wpa_supplicant.conf is used on both OS. But this option allows for more flexibility. So here is what I do.
First I create
/etc/wpa in both FreeBSD and Linux. Then I edit
/etc/wpa/local.conf with the wpa_supplicant options specific to this OS. Then I use this small script to select a particular profile and create the appropriate
#!/bin/sh if [ ! -r "$1" ] then echo "error: cannot read '$1'" exit 1 fi cat /etc/wpa/local.conf > /etc/wpa_supplicant.conf cat "$1" >> /etc/wpa_supplicant.conf
The idea behind those profiles is to restrict scanning of new networks depending on the situation. For instance you can have one profile for your home, one for your working place, one when you go abroad. It’s easier to organize your configuration that way and also avoids to send probe requests on the air that can disclose information about you.
Thus on FreeBSD, I create
/etc/wpa/profiles along with the various profiles and on Linux, I just link to it.
If you happen to use nullmailer as your local MTA, you can share your smtp credentials too. But there is a catch. The
remotes file in the nullmail configuration must be owned by the nullmailer user/group. This user/group is different on Linux than it is on FreeBSD (nullmail on FreeBSD, mail on Linux). Fortunately when you mount a filesystem, it only cares about the UID/GID, not the actual user/group name. So if we change the UID/GID of the user/group mail to match the UID/GID of the nullmail user/group on FreeBSD, it will appear as the same user but with a different name on each OS. That’s what we’ll do on Linux, we will change the UID/GID of mail to match the one on FreeBSD.
First, let’s list all files owned by user mail:
find / -xdev -user mail > user find / -xdev -group mail > group
Second, check that we won’t mess around too much by changing these files:
$ cat user group | sort | uniq /etc/nullmailer/remotes /usr/bin/dotlockfile /usr/bin/mailq /usr/sbin/nullmailer-queue /var/mail /var/spool/nullmailer /var/spool/nullmailer/failed /var/spool/nullmailer/tmp /var/spool/nullmailer/trigger
Seems OK. Now let’s find out the UID/GID of the nullmail user group on FreeBSD:
$ cat /mnt/freebsd/etc/passwd | grep nullmail nullmail:*:522:522:Nullmailer Mail System:/var/spool/nullmailer:/bin/sh $ cat /mnt/freebsd/etc/group | grep nullmail nullmail:*:522:
The UID/GID is 522:522 on FreeBSD. We will change user/group mail on Linux to UID/GID 522:
# Stop nullmailer so that we can change the UID/GID service nullmailer stop # Change UID/GID usermod -u 522 mail groupmod -u 522 mail # The files are still owned by the old UID/GID. # We change that cat user | while read file do chown mail: "$file" done cat group | while read file do chown :mail "$file" done # Clean rm user group
Now we link nullmailer configuration into Linux:
rm -rf /etc/nullmailer ln -s /mnt/freebsd/usr/local/etc/nullmailer /etc/nullmailer
You should be able to
service nullmailer restart now.