Apr 4, 2009
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 CONFIG_UFS_FS_WRITE=y
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!
Conclusion
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.
Cheers,
Ignace M -ghantoos-
Sources
http://www.quietearth.us/articles/2006/09/15/Ubuntu-Compiling-a-custom-kernel
http://wiki.netbsd.se/How_to_mount_FFS_partition_under_Linux
http://kernel.xc.net/html/kconfig-2.6.29_x86.html
Mortel ce petit tipaz, merci grand Ghantoos!
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.
[...] Place Ghantoos » Mounting UFS in read/write under Linux (debian) (tags: bsd ufs filesystems linux mount sysadmin kernel compile write) [...]
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.
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
[...] not expect FreeBSD to support every Linux centric filesystem out there) So that does not work:? http://ghantoos.org/2009/04/04/mount…e-under-linux/ I guess i have to [...]
Hi!
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.
@Edmundo
I hope this works for you!
Thanks for your comment.
Ignace M -ghantoos-
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
[...] 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 [...]
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 ?
[...] 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 [...]