JFS is a journaling file system originally developed by IBM. It's considered to be mature and stable but it's not commonly found on Linux servers. I was curious to see what it would take to install it and later benchmark it. I'll cover the installation here and will do a benchmark comparison on a later post.

I did find a kernel module here but unfortunately I run into trouble installing it. I'll describe how I got it to work.

1. Install the ELRepo:

yum -y install http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

2. Install the kernel module 'kmod-jfs':

yum --enablerepo=elrepo* install kmod-jfs -y

3. So far, so good - let's try to load the module:

modprobe jfs
modprobe: FATAL: Module jfs not found.

4. That's strange. Let's see if we can find the module. First, let's install the yum-utils package so that we can get the repoquery command and see what the package installed:

yum -y install yum-utils

5. Now let's see the package contents using repoquery -l kmod-jfs:

repoquery -l kmod-jfs
/etc/depmod.d/kmod-jfs.conf
/lib/modules/3.10.0-514.el7.x86_64
/lib/modules/3.10.0-514.el7.x86_64/extra
/lib/modules/3.10.0-514.el7.x86_64/extra/jfs
/lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko
/usr/share/doc/kmod-jfs-0.0
/usr/share/doc/kmod-jfs-0.0/GPL-v2.0.txt

6. As you can see it should have installed the /lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko file. Let's confirm:

file /lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko
/lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=7d6bcbb3b4d868f77f308ee2d41230fefecfbfcc, not stripped

And there it is.

7. Let's get some more information about this module using the modinfo command:

modinfo /lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko
filename: /lib/modules/3.10.0-514.el7.x86_64/extra/jfs/jfs.ko
alias: fs-jfs
license: GPL
author: Steve Best/Dave Kleikamp/Barry Arndt, IBM
description: The Journaled Filesystem (JFS)
rhelversion: 7.3
srcversion: A8C71449C466986CE8F94DD
depends: 
vermagic: 3.10.0-514.el7.x86_64 SMP mod_unload modversions 
signer: The ELRepo Project (http://elrepo.org): ELRepo.org Secure Boot Key
sig_key: F3:65:AD:34:81:A7:B2:0E:34:27:B6:1B:2A:26:63:5B:83:FE:42:7B
sig_hashalgo: sha256
parm: nTxBlock:Number of transaction blocks (max:65536) (int)
parm: nTxLock:Number of transaction locks (max:65536) (int)
parm: commit_threads:Number of commit threads (int)

The vermagic seems to point to a different kernel version than ours: 3.10.0-514.el7.x86_64 SMP

Here's our kernel version:

uname -r
3.10.0-327.22.2.el7.x86_64

8. Looks like the correct kernel version happens to be installed but not enabled:

rpm -qa | grep -i kernel
kernel-3.10.0-514.16.1.el7.x86_64

9. Follow my instructions here to install the right tools to switch the kernel - I'll go through the steps real fast:

yum -y install grub2-tools grub2-tools-minimal
echo "GRUB_DISABLE_SUBMENU=y" >> /etc/default/grub
grub2-mkconfig -o /boot/grub/grub.cfg

Check the installed kernels:

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub/grub.cfg 
0 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core) (recovery mode)
2 : CentOS Linux (3.10.0-327.22.2.el7.x86_64) 7 (Core)
3 : CentOS Linux (3.10.0-327.22.2.el7.x86_64) 7 (Core) (recovery mode)
4 : CentOS Linux (0-rescue-ed21cfeae62c9d8b440cbc3f8e696dce) 7 (Core)
5 : CentOS Linux (0-rescue-ed21cfeae62c9d8b440cbc3f8e696dce) 7 (Core) (recovery mode)

We set the kernel to 0:

grub2-set-default 0

and reboot: reboot

10. SSH back in and check your kernel version:

uname -r
3.10.0-514.16.1.el7.x86_64

11. Cool, now try the modprobe command again:

modprobe jfs

No output - let's check what lsmod has to say:

lsmod | grep -i jfs
jfs 180330 0

And it's good to go!

Installing the JFS tools:

1. Install some dependencies to compile the jfs tools:

yum -y install gcc e2fsprogs-devel libuuid-devel

2. Get the jfs tools - this will give us mkfs.jfs:

cd /tmp
wget http://jfs.sourceforge.net/project/pub/jfsutils-1.1.15.tar.gz
tar -xzf jfsutils-1.1.15.tar.gz
cd jfsutils-1.1.15

3. Fix a bug by editing the file ./fscklog/extract.c - then find the line:

You can fix this by running:

sed -i -e '/#include <unistd.h>/a#include <sys/types.h>' ./fscklog/extract.c

Or if you would like the details:

#include <unistd.h>

then after that line, add this one:

#include <sys/types.h>

otherwise you might get this error:

extract.c: In function readwrite_device’:
extract.c:601:8: warning: implicit declaration of function ujfs_rw_diskblocks [-Wimplicit-function-declaration]
 ujfs_rw_diskblocks(Dev_IOPort, dev_offset,
 ^
extract.c: In function validate_super’:
extract.c:743:3: warning: implicit declaration of function ujfs_get_dev_size [-Wimplicit-function-declaration]
 ujfs_get_dev_size(Dev_IOPort, &bytes_on_device);
 ^
make[2]: *** [extract.o] Error 1
make[2]: Leaving directory `/tmp/jfsutils-1.1.15/fscklog'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/jfsutils-1.1.15'
make: *** [all] Error 2

4. Compile, make and install the jfs tools:

./configure
make -j`nproc`
make install

5. Nice - and now we have a mkfs.jfs:

which mkfs.jfs
/usr/sbin/mkfs.jfs

6. Format your disk:

mkfs.jfs /dev/sda1 
mkfs.jfs version 1.1.15, 04-Mar-2011
Warning! All data on device /dev/sda1 will be lost!
Continue? (Y/N) y
 |
Format completed successfully.
732419383 kilobytes total disk space.

7. And mount it:

mkdir /mnt/jfs
mount /dev/sda1 /mnt/jfs

8. Check the output of df -hT /mnt/jfs/ :

df -hT /mnt/jfs/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 jfs 3.0T 376M 3.0T 1% /mnt/jfs

Brilliant!

Sources: