Betrfs相关知识点

Betrfs特点

1. 内核文件系统
2. 层次: VFS ---> BetrFS ---> B^e Tree ---> ext4;
3. 底层为TokuDB;

Betrfs安装内核版本

由于代码限制,betrfs目前只能安装在linux-3.11.10这个内核版本之上;[具体限制见官网]

安装前的依赖(准备)

安装的库有:gcc-4.7,g++-4.7,zlib1g-dev,build-essential,cmake,valgrind,cscope

Betrfs安装 (以64 bit Ubuntu Server 13.10版本为例)


1. 内核准备

mkdir betrfs
cd betrfs
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.11.10.tar.gz
tar -xvf linux-3.11.10.tar.gz
cd linux-3.11.10
cp ../pthread_union_check.py ./
patch -p1 < ../linux-3.11.10.diff
make oldconfig
(找到CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS相关的配置项,设置为madvise,并选择为exclude)

make oldconfig:利用原来内核中的/boot目录下的config文件来编译新内核,对于新的特性会在该命令后显示出来;具体操作过程是拷贝/boot目录下的config文件到新内核主目录,然后重命名为.config [或者拷贝后运行make menuconfig, 然后load,然后重命名]

./pthread_union_check.py
make -j4
make modules
make modules_install
make install

2. TokuDB 编译

mkdir build  # in the top-level directory of the betrfs repository
cd build

CC=gcc-4.7 CXX=g++-4.7 cmake \
      -D CMAKE_BUILD_TYPE=$TYPE \
      -D USE_BDB=OFF \
      -D USE_TDB=ON \
      -D BUILD_TESTING=OFF \
      -D CMAKE_INSTALL_PREFIX=../ft-install/ \
      -D BUILD_FOR_LINUX_KERNEL_MODULE=ON \
      ..

cmake --build . --target install

3. 编译Betrfs源码

cd filesystem/
make

4. 挂载文件系统

进入betrfs的源码目录,假设记为 REPO
mkfs.ext4 /dev/sdb
mkdir mnt
mount -t ext4 /dev/sdb mnt
cd mnt
rm -rf *
mkdir db
mkdir dev
touch dev/null
mkdir tmp
chmod 1777 tmp
cd -
umount mnt
cd $REPO/filesystem;make;cd -;
modprobe zlib
insmod $REPO/filesystem/ftfs.ko sb_dev=/dev/sdb sb_fstype=ext4
touch dummy.dev
losetup /dev/loop0 dummy.dev
mount -t ftfs /dev/loop0 mnt

5. remount 文件系统 (加入了清cache过程,单纯的remount或卸载可以去除此步骤)

sync && echo 3 > /proc/sys/vm/drop_caches
sync
umount mnt
rmmod $REPO/filesystem/ftfs.ko
modprobe zlib
insmod $REPO/filesystem/ftfs.ko sb_dev=/dev/sdb sb_fstype=ext4
mount -t ftfs /dev/loop0 mnt

6. FAQ

在安装3.11.10版本的内核时,代码能正常编译成功,但是出现reboot时卡在Loading initial ramdisk…

曾经在grub.cfg对应的内核版本下加入了nomodeset来禁用视频特性仍不起效;

最后分析得出原因:由于在安装Ubuntu 13.10的时候由于更新源有些页面失效,就用国内的源替换了旧的,随后执行了apt-get upgrade;实际上apt-get upgrade会触发update-grub;从而会破坏镜像;
解决方法:将Ubuntu 14.04的源替换旧的源,这样就不会出现失效的链接;随后执行apt-get update操作来更新一下;之后进入正常的编译流程即可;

附件下载

https://github.com/Brayden-Lee/attachment/blob/master/sources.list