热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

fcache:加速linux的启动

文章标题:fcache:加速linux的启动。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  一. 简介:

  fcache的作者是Jens Axboe,他是把这个patch当成一个weekend project写的 。

  这个补丁的目的是在不修改文件系统的前提下,而使启动的流程是完全线性的(应该是指读磁盘的流程),从而加速linux的启动,简单的说fcache就是文件系统和块设备之间一种重映射。

  fcache有两种运行模式:prime模式和normal模式。当运行在prime模式时,他缓存一切对目标分区的读操作,写入缓存分区。从而使数据在缓存设备中线性存放,即是一个关于时间的函数。当运行在normal模式时,fcache将会在缓存设备中查找缓存,如果命中的话,那么启动即可以直接读入缓存设备的线性数据。由于启动流程大多时候是重复性的,因此,fcache会提供完美的获取启动数据途径。

  一般来说,第一次启动使用prime模式,准备好缓存数据,以后启动时使用normal模式,可以大大加速启动的速度(只要你的启动流程不变的话)

  这里有一份hzmagnel写的关于fcache原理的文档,有兴趣的同学可以随便翻翻,我们会感动的内牛满面!

  二. 如何使用fcache

  Step 1:给内核打上fcache补丁,推荐的内核版本是2.6.17

  cd /usr/src/linux

  下载补丁 wget http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.17/2.6.17-ck1/patches/fs-fcache-v2.1.patch

  进入内核源代码目录 patch -p1 Block devices->Boot fronted cache driver

  然后重新编译内核,并使用这个内核。

  Step 2:创建fcache的分区

  分区大小为512M左右,文件系统为ext3,如果仅仅为试验,可以暂时使用swap分区作为fcache的分区

  Step 3:修改启动和关闭脚本

  在linux启动的时候,根文件系统第一次被加载的时候是readonly的,等到检查完根文件系统,这时候再用rw的方式remount根文件系统。我们要做事情就是在remount的时候,加上fcache的参数。而remount的所在是因不同发行版而异的,比如在gentoo中,remount在/etc/init.d/checkroot里,而在suse中,remount在/etc/init.d/rootfsck中。我们可以通过grep

  "remount"找到那个脚本。

  找到那个脚本后,找出mount -n -o remount,rw / 2>/dev/null

  修改为mount -n -o remount,fcache_dev=#/*,fcache_prime=0 / 2>/dev/null

  以下针对ubuntu 7.04,写出一种具体做法(注意:其他版本需要做相应调整)

  编辑 /etc/init.d/checkroot.sh脚本,找到

  if ! mount -n -o remount,$rootopts,$rootmode $fstabroot / 2>/dev/null

  then

  mount -n -o remount,$rootopts,$rootmode /

  fi

  修改为

  if ! mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 $fsabroot /

  2>/dev/null

  then

  mount -n -o remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 /

  fi

  注意这里fcache_dev=#/*,其中fcache_dev是指我们在第二步创建的那个分区对应的设备。

  #代表主设备号,*代表次设备号。比如笔者的使用的IDE硬盘,是hda10,因此fcache_dev=3/10

  编辑/etc/init.d/umountroot脚本,找到

  mount $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev /

  2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro dummydev /

  2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro

  修改为

  mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/* -t

  dummytype dummydev / 2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*

  dummydev / 2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*

  /

  ok,现在可以重新启动了,这时候,fcache就会进入prime模式。这次启动会比平时启动稍微慢一点。启动完毕,进入桌面后,执行mount

  / -o remount,fcache_dev=#/*,fcache_prime=0

  我们可以检验一下,fcahce是否工作了

  ken@ubuntu:~$ dmesg | grep "fcache"

  [17179592.200000] fcache: new header: first block 2872, max 294040

  [17179592.200000] fcache: hda10 opened successfully (priming)

  [17180105.728000] fcache: ios r/w 6286/4904, hits 0, misses 0, overwrites 766

  [17180105.744000] fcache: wrote 6286 extents, holding 354656 sectors of data

  [17180105.756000] fcache: wrote header (extents=6286,serial=27)

  [17180105.808000] fcache: header looks valid (extents=6286 extents, serial=27)

  [17180105.824000] fcache: loaded 6286 extents

  [17180105.824000] fcache: hda10 opened successfully (not priming)

  可以看到,fcahce的确处于prime模式,并且缓存启动时的数据。

  最后再次修改/etc/init.d/checkroot.sh,把第一次我们修改的地方,再修改为

  if ! mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 $fsabroot /

  2>/dev/null

  then

  mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 /

  fi

  即让fcahce处于normal状态,再次启动,你就能享受fcache给你带来的启动如飞的感觉了。

  以后如果你的启动流程变了,比如你增加或减少某些启动脚本,则需要重新激活prime模式一次,即重复一遍上述流程。

  个人觉得从出现gdm的登录窗口,到登录,完全进入桌面环境,加载完启动项。这一段时间,fcache带来的速度提升是相当明显的。

  以下是测试报告

  time1 time2 total

  --------------------------------------------------------------------------------------

  fcache and prime=1 50s 52s 102s

  fcache and prime=0 46s 29s 75s

  without fcache 48s 38s 86s

  注: time1表示从加载内核到出现登录窗口

  time2表示从开始登录到完全启动完毕


推荐阅读
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文讨论了在Linux系统中,使用chown命令将django项目目录下的static目录的拥有者从root改为eureka的问题。作者尝试了多种命令,包括chown和sudo chown等,但都没有成功修改拥有者。文章提供了相关目录的权限信息,并补充了项目所在磁盘和操作系统的信息。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
author-avatar
手机用户2502937447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有