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