注:以Ubuntu为例说明

在Linux计算机上,有两个时间,一个是硬件时间(BIOS中记录的时间,称为hwclock),另一个是操作系统时间(osclock)。硬件时钟由BIOS电池供电,

当计算机关机后,会继续运行,BIOS电池一般可使用几年,如果没电了,那BIOS中的数据会恢复出厂设置。

1. 硬件时间

时间是有时区的,无论硬件时间还是操作系统时间。hwclock的时区在/etc/default/rcS文件中设置,里面有一个参数UTC,默认值为True,表示使用UTC时

区,如果设置为no,那表示使用osclock的时区。建议hwclock与osclock设置相同的时区。注:由于我的osclock也是UTC时间,所以这里UTC=yes还是

UTC=no都是一样的。

# assume that the BIOS clock is set to UTC time (recommended)
UTC=yes

查看硬件时间

njsqrt3@test:~$ sudo hwclock -r
Sun Dec :: AM UTC -1.044336 seconds
njsqrt3@test:~$

将osclock写入hwclock

zhj@test:~$ sudo hwclock -w
zhj@test:~$

2.操作系统时间

osclock的时区配置文件为/etc/timezone,如果你想修改,那最好使用sudo dpkg-reconfigure tzdata来修改时区,不建议直接修改/etc/timezone文件,

如果你想修改为UTC时间,那执行sudo dpkg-reconfigure tzdata命令时,选择None of the above->UTC 即可

zhj@test:~$ cat /etc/timezone
Etc/UTC
zhj@test:~$

查看osclock

zhj@test:~$ date
Sun Dec :: UTC
zhj@test:~$

修改osclock

#修改时/分/秒
sudo date -s hh:mm:ss #修改年/月/日
sudo date -s MM/DD/YY

我们一般会使用ntp同步osclock,这一点是非常重要的,无论你是单台主机还是集群,你要保证你的时间必须与国际原子时同步,如果你不同步,那你主机的时

间与国际原子时相差几秒甚至几分钟都是有可能的,想象一下,如果新浪微博的服务器没有同步时间,假设当前国际原子时间为2014-12-28T14:20:00Z,而新

浪微博服务器的时间为1989-06-04T10:00:00Z,那我发的微博就穿越了到了1989年6月4日,那天在天安门发生了大动乱,如果新浪微博的应用服务器集群之间

也没有时间同步,假定server1为2014-12-28T09:00:00Z,server2为2014-12-27T09:00:00Z,两者相差一天。我发微博时用的是server1,我的一个朋

友评论了我的微博,评论使用的是server2,这他妈奇迹就出现了,他的评论时间比我发微博的时间还早。

如果是单台主机,那我们的主机当ntp客户端就行了,找一个ntp服务器(如0.ubuntu.pool.ntp.org)直接使用ntpdate命令就可以同步,一般我们将它做成

cron定时任务,该任务将osclock与国际原子时同步后,还要将osclock写入hwclock(后面会讲为何将osclock刷入hwclock)。那如果是集群呢?我们一般是将其

中一台主机做成ntp服务器,安装ntpd软件(该软件就叫ntp,为了与ntp协议区分,这里用它的守护进程名ntpd代替),通过sudoapt-get install ntp安装,这

个软件既可以做服务端也可以做客户端。做为客户端,它从上层的ntp server那里获取到国际原子时;做为服务端,它为集群内中的客户机提供国际原子时

间。这样做可以节约外网网络带宽。

注:ntpd软件与ntpdate软件不能同时运行。对于集群中的ntp server服务器,要安装ntpd,配置好ntpd后,它会自动定时同步上层ntp server的时间到

osclock,不过它没有写入hwclock的配置项,所以我们还要手动在cron添加定时任务,将osclock写入hwclock。对于集群中的客户机,编写cron任务,用

ntpdate命令(一般的,在安装好Ubuntu后,就有该命令了)从集群ntp server的那里获取标准时间,更新osclock,同时更新后,也要将osclock写入hwclock。

3.硬件时间与操作系统时间的交互

下面说一下硬件时间与操作系统时间的交互流程

1、开机时,操作系统从BIOS中读取硬件时间+时区,然后根据osclock的时区,转换为对应的时间。然后操作系统时间与硬件时间就独立运行,相互不影响,我们

通过应用程序获取的时间用的都是操作系统时间。这一步是开机时os自动完成的。

2、主机运行过程中,通过ntp保证osclock与国际原子时同步,再将osclock同步到hwclock。这一步需要自己配置实现

3、关机时,osclock写入hwclock。这一步是关机时os自动完成的。不过我们要考虑异常关机的情况,当异常关机时,osclock可能没有写入hwclock,这就是为什

么在第2步中将osclock定时刷入hwclock的原因。如果不定时刷入,那osclock与hwclock差距比较大时,若异常关机,osclock就丢掉了,再开机时,osclock就是

错误的,在第一个ntp同步到来时,osclock就一直是错误的。而且如果使用的是ntpd,ntpd是渐进调整,要经过多个ntp同步周期后才会将osclock调整为国际原子

时,另外,如果osclock与ntp server的时间差超过1000秒,那ntp server就不会更新osclock了。(别,如果你安装了Ubuntu GUI,并设置了

System Settings->Time&Date->Automatically from the Internet,那它会自动同步时间)

4、ntpd与ntpdate

参见https://help.ubuntu.com/10.04/serverguide/NTP.html

ntpd当发现ntp client与ntp server时间不相同时,使用渐进同步,如果ntp server与client之间的差距超过1000秒,那就直接不同步了;ntpdate是跃迁式

同步,一步到位。ntpd与ntpdate是不能同时运行的,如下,在ntpd运行的情况下,执行ntpdate时会出错。ntpd和ntpdate使用的都是123号端口,然后我们把

ntpd停掉,再执行ntpdate,就可以了。

zhj@test:~$ sudo ntpdate .ubuntu.pool.ntp.org
Dec :: ntpdate[]: the NTP socket is in use, exiting
zhj@test:~$
zhj@test:~$ sudo service ntp stop
* Stopping NTP server ntpd [ OK ]
zhj@test:~$ date
Sun Dec :: UTC
zhj@test:~$ sudo ntpdate .ubuntu.pool.ntp.org
Dec :: ntpdate[]: adjust time server 202.112.31.197 offset 0.018119 sec
zhj@test:~$

一般的,在集群的ntp server主机上,考虑到该主机时间与国际原子时可能超过1000秒,一般先停止ntpd,然后用ntpdate同步一下时间,然后再开启ntpd

服务,自动定时同步。而集群中的ntp客户机,就在cron定时执行ntpdate和hwclock -w任务就行了。当然,如果你不嫌麻烦,也可以在客户机上安装ntpd服务,

前面我们提到ntpd既可以做服务端,又可以做客户端,这个在ntpd的配置文件/etc/ntp.conf中配置一下就行,restrict项只保留默认的下面四项即可,其它

restrict项注释掉,另外,你还是要在cron中设置定时任务hwclock -w

# By default, exchange time with everybody, but don't allow configuration.
restrict - default kod notrap nomodify nopeer noquery
restrict - default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::

参考:

linux系统时间和硬件时钟问题(date和hwclock)

鸟哥的 Linux 私房菜 -- 服务器架设篇目录    NTP 时间服务器

Linux操作系统时间与BIOS硬件时间的更多相关文章

  1. Ubuntu 16.04将系统时间写入到硬件时间BIOS

    说明:在Ubuntu中为了和Windows保持一致,会将系统时间设置成CST的,所以下面的说法是设置成UTC的问题是由于所在的环境不一致导致的,本章只讨论如何设置时间到BIOS,不做时区分析,下面忽略 ...

  2. ubuntu下的时间设定(硬件时间,系统时间,本地时间)

    问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...

  3. setclock - 用系统时间来设置硬件时间

    总览 setclock 描述 setclock 用当前系统时钟存储的时间设置系统的硬件时间. 它先读取 /etc/sysconfig/clock 的时间格式, 时间存储前应该转化成这种格式. Red ...

  4. 趣谈linux操作系统笔记-从BIOS到bootloader

    BIOS 在主板上,有一个东西叫ROM(Read Only Memory,只读存储器).这和咱们平常说的内存RAM(Read Access Memory,随机存取存储器)不同. 而 ROM 是只读的, ...

  5. linux 系统文件类型、系统安装时间、系统启动时间、系统运行时间、设置及显示时间、系统时间和硬件时间

    系统文件类型: 1) $mout 2) df -l:仅列出本地文件系统:-h (--human-readable):-T:文件系统类型 $df -lhf 3) file -s (--special-f ...

  6. Linux的硬件时间、校正Linux系统时间及系统时间调用流程

    第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时.   ...

  7. Linux 系统时间和硬件时间

    linux 的系统时间有时跟硬件时间是不同步的 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel ...

  8. linux 系统时间 硬件时间

    Linux时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称RTC).系统时钟是指当前Linux Kernel中的时钟:而硬件时钟则是主板上由电池供电的时钟, ...

  9. Linux和win7(win10)双系统时间错误问题 时间相差8小时

    转载自 http://m.2cto.com/os/201204/126212.html 有修改 前一段时间刚装了centos 5.4和win7的双系统.发现win7的系统时间不对,机子没上网,每天开机 ...

随机推荐

  1. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  2. (转载)UITableView使用详解

    在开发iphone的应用时基本上都要用到UITableView,这里讲解一下UITableView的使用方法及代理的调用情况 UITableView使用详解 - (void)viewDidLoad { ...

  3. A*寻路初探 GameDev.net 转载

    A*寻路初探 GameDev.net 译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念.这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为 ...

  4. Java 炫舞按键功能 DancingPlay (整理)

    /** * Java 炫舞按键功能 DancingPlay (整理) * 2016-1-2 深圳 南山平山村 曾剑锋 * * 设计声明: * 1.本次设计是模仿QQ炫舞类游戏,当图标到红色的检测区域时 ...

  5. 【英语】Bingo口语笔记(50) - Drop系列

  6. jQuery事件绑定方式(转)

    bind() 简要描述 bind()向匹配元素添加一个或多个事件处理器. 使用方式 $(selector).bind(event,data,function) event:必需项:添加到元素的一个或多 ...

  7. Oracle RAC 服务器端连接负载均衡(Load Balance)

    Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去.当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到 ...

  8. 无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块

    无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块.(异常来自 HRESULT:0x8007007E).

  9. 2016年JavaScript技术栈展望

    如果你正在筹划新的前端项目或者重构现有项目,那么你需要认识到现在的前端开发环境已经今非昔比,这其中有太多的选择了:React.Flux.Angular.Aurelia.Mocha.Jasmine.Ba ...

  10. Javascript 日期时间格式正则

    因为Javascript的日期格式判断可能因浏览器的版本有所不同,所以用正则判断会比较好,这里备注一个正则用来判断日期时间的格式: ^(?=\d)(?:(?!(?:1582(?:\.|-|\/)10( ...