Place Ghantoos

Mounting UFS in read/write under Linux (debian)


A week ago, I encountered some space problems on my FreeBSD system during a system wide portupgrade. Fortunately, I had backed up my system just before the adventure, so my system was saved.

The procedure I followed to restore my data, was:
1- recreate my partitioning, giving 10 more Gigs to the system, using the FreeBSD installation CD
2- copy all the data on it

Since I backed up my FreeBSD system on an external ext3 hard drive, I needed to copy it back from “outside” my freebsd system. My first option was to use Fixit from the FreeBSD installation CD set, but I had problems mounting my partition because of the inode block size of my ext3 partition. Bref. I decided to mount everything from my Linux (ubuntu) system, and copy everything back from there!

I only way to do this was to recompile my kernel with the right “UFS write” flag. And it JUST WORKED!! I copied back __ALL__ my FreeBSD system on the new slices, rebooted my machine, and here I am writing this post from my old-new FreeBSD system! :)

What I did

By default, up to the Linux kernel 2.6.29, UFS file system write support is considered as “dangereous/experimental” and so, not set. Which means that, by default, a Linux machine will only mount your UFS partitions in readonly:

$ sudo mount -t ufs -o ufstype=ufs2 /dev/sdb5 /mnt/
mount: wrong fs type, bad option, bad superblock on /dev/sdb5,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

$ dmesg | tail -n 1
[  871.777769] ufs was compiled with read-only support, can't be mounted as read-write

In order to actually mount it, you need to specify the readonly flag:

$ sudo mount -t ufs -o ro,ufstype=ufs2 /dev/sdb2 /mnt/

First of all, you need to download you kernel’s sources, and copy the .config of your current kernel:

$ sudo -s
# apt-get install linux-source-2.6.27
# cd /usr/src
# bzip2 -dc linux-source-2.6.27.tar.bz2 | tar xf -
# cp /boot/config-2.6.27-2-686 .config

To add the UFS write support to your kernel, uncomment/add the CONFIG_UFS_FS_WRITE flag in the config of your kernel, then re-compile it:

$ grep  CONFIG_UFS_FS_WRITE /usr/src/linux-source-2.6.27/.config

To compile my kernel, I followed the instruction here. I just added CONCURRENCY_LEVEL=2 to use the 2 cores of my CPU.

$ sudo -s
# CONCURRENCY_LEVEL=2 make-kpkg --initrd --append-to-version=-2-686-ufs kernel-image kernel-headers

Once the compilation is through, install your freshly built kernel (you should find the .deb files in /usr/src/) , and reboot on it.

$ sudo dpkg -i /usr/src/linux-image-2.6.27-1-686-ufs_2.6.27-1-686-ufs-10.00.Custom_i386.deb

NOTE for debian users: If you get kernel panics when booting. It could be because of the missing initrd associated to the new kernel. In this case, if you are using kernel-package-12.009 (or higher?) make sure you copy initramfs hooks so that your package generates the initrd uppon installation (and removes it when package is uninstalled):

cp /usr/share/kernel-package/examples/etc/kernel/postinst.d/initramfs /etc/kernel/postinst.d/
cp /usr/share/kernel-package/examples/etc/kernel/postrm.d/initramfs /etc/kernel/postrm.d/

Once you have booted on your new “UFS-writable” kernel:

$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x8f8000b1

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1958    15727603+  83  Linux
/dev/sdb2   *        1959        4569    20972857+  a5  FreeBSD
/dev/sdb3            4570        4830     2096482+  82  Linux swap / Solaris
/dev/sdb4            4831       60801   449587057+  83  Linux

In this case, /dev/sdb2 contains my UFS slices.
If we take a closer look at /dev/ we will be able to see all the slices (this actually works by default)

$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 2009-04-04 16:20 /dev/sdb
brw-rw---- 1 root disk 8, 17 2009-04-04 14:20 /dev/sdb1
brw-rw---- 1 root disk 8, 18 2009-04-04 16:20 /dev/sdb2  <--- FreeBSD paartition
brw-rw---- 1 root disk 8, 19 2009-04-04 16:20 /dev/sdb3
brw-rw---- 1 root disk 8, 20 2009-04-04 14:20 /dev/sdb4
brw-rw---- 1 root disk 8, 21 2009-04-04 16:20 /dev/sdb5  <--- FreeBSD / slice
brw-rw---- 1 root disk 8, 22 2009-04-04 16:20 /dev/sdb6  <--- FreeBSD swap
brw-rw---- 1 root disk 8, 23 2009-04-04 16:20 /dev/sdb7  <--- FreeBSD /var slice
brw-rw---- 1 root disk 8, 24 2009-04-04 16:20 /dev/sdb8  <--- FreeBSD /tmp slice
brw-rw---- 1 root disk 8, 25 2009-04-04 16:20 /dev/sdb9  <--- FreeBSD /usr slice

Then, I mounted the slices in the right order and to the right mount points (in /mnt/) to have my FreeBSD exact filesystem environment. Then I copied back all the data using the old and nice tar technique, as root:

# ( cd /path/to/backup && tar cpf - . ) | ( cd /mnt/ && tar xvfp - )

Once the "un"-tar was done, I rebooted on my FreeBSD system (from which I am writing this post), forced the fsck of all my slices: everything seems to be OK!


The CONFIG_UFS_FS_WRITE kernel flag is still set as experimental, but it did work like charm for me (using kernel 2.6.27).
If you do use it, and you find a bug, please report it refering to this doc :)

Hope this was helpful.

Ignace M -ghantoos-



12 Responses

  1. FRLinux says:

    Mortel ce petit tipaz, merci grand Ghantoos!

  2. Garry says:

    Nice! I esp. like the part about building your own kernel and rolling it up in a .deb all in a few commands. Simple and powerful.

  3. [...] Place Ghantoos » Mounting UFS in read/write under Linux (debian) (tags: bsd ufs filesystems linux mount sysadmin kernel compile write) [...]

  4. thadk says:

    for the record Solaris X86 ufs RW support is effectively not functional at all. Though it is mounted -rw, It simply reports read only file system for every operation & some people reported destruction with chmod.

  5. Phillip says:

    If you get the error “Read-only file system” when trying to write to the drive you need to do a fsck on
    a solaris machine before mounting under linux. Looking at the code there are quire a few states that
    remark the file system as readonly.

    Run: dmesg | tail
    if you see any of the following then it will be marked as readonly
    ufs_read_super: fs is active
    ufs_read_super: fs is bad
    ufs_read_super: can’t grok fs_clean 0xFFFFFFF
    ufs_read_super: fs needs fsck

    if you see any of the following then it will be left as readwrite
    fs is clean
    fs is stable
    fs is DEC OSF

  6. [...] not expect FreeBSD to support every Linux centric filesystem out there) So that does not work:?…e-under-linux/ I guess i have to [...]

  7. Edmundo says:


    Cool, i haven’t tried yet but seems to will work, so I can see one irony:

    FreeBSD – cannot mount EXT4 partitions from native way and included in the release (yet).
    Linux – cannot mount UFS2 partitions from native way and included in the release (yet).

    BUT! both systems can mount NTFS and FAT32 partitions… ironic, no?

    I was googling for a cross-platform system file, to have one partition of data and two of O.S; but I only found that FAT is supported for many O.S. (that sucks). I KNOW that ext2 is supported for Unix but i think that is slow …

    I’ll try this trick (recompile my linux’s kernel) and except the best, if not i’ll moved to NTFS or FAT (but very ungry)…

    Regards, sorry for my bad english because I’m mexican :P.

  8. @Edmundo
    I hope this works for you!

    Thanks for your comment.
    Ignace M -ghantoos-

  9. Sotamarsu says:

    Should it be like this?

    # cp /boot/config-2.6.27-2-686 .config <—

    I think this is the right path?
    # cp /boot/config-2.6.27-2-686 linux-source-2.6.27/.config

  10. [...] Some further research shows that the ufs module is (usually) compiled without write support. This link explains how to enable write-support with linux, and it seemed to work for him. If you have [...]

  11. Kegeruneku says:

    Now for the challenge of the day :

    I got a FreeBSD VM running over kvm, with a LVM backend for the storage. I am able to mount the root using kpartx however the slices are now properly detected, thus the majority of datas are missing.

    Do you happen to know a way to detect slices on a Linux LV ?

  12. [...] me retaper le man. C’est comme ça j’oublie. Et la, ghantoos arrive, et il nous gratte cette doc de derrière les fagots qui explique [...]

Leave a Reply