使用faketime修改单个应用程序的系统时间

背景

  • 我们有业务程序在测试时,需要把时间设置到指定时间去做一些测试,像这些程序,我们之前的做法都是分配一台低配置的虚拟机,然后可以独立修改系统时间。来解决这类需求

问题

  • 经常有很多人需要在同时测试,这时候没办法,有多少人有需求就要建多少台虚拟机。很多时候部分虚拟机属于空闲状态的,比较浪费资源。
  • 考虑过用Docker,Docker的时间是跟宿主机一起的,也可以用Docker通过调整时区来修改时间,但只能修改24小时内,不能跨多天调整。但也算是一种方案了

Faketime

  • 放狗搜索时找到个神器 libfaketime
  • GitHub上的介绍:libfaketime modifies the system time for a single application

使用

  1. 安装,非常简单。

    git clone https://github.com/wolfcw/libfaketime.git
    cd libfaketime
    make && make install
    
  2. GitHub页面上有了非常详细的使用说明了。举个很简单的粟子。

    • 指定动态链接库

      # 正常时间
      [root@inorz.net ~]# date
      Mon Mar 26 21:01:46 CST 2018
              
      [root@inorz.net ~]# LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-1d" date
      Sun Mar 25 21:01:48 CST 2018
      
    • faketime 命令

      [root@inorz.net ~]# date
      Mon Mar 26 21:04:42 CST 2018
      [root@inorz.net ~]# faketime '2018-03-27 21:04:52' date
      Tue Mar 27 21:04:52 CST 2018
      
    • 功能非常多,很强大。更多用法可参考 GitHub 上的说明

其他用法

  1. Docker:集成在容器中,初始化时按需指定时间。可以实现容器内时间和宿主机不一致
  2. Mac OS X下可以用来无限延长某些未注册软件的使用时间(有能力还是希望多多支持正版)
  3. 欢迎补充