Linux系统时间偏差的纠正

实际上,linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间来进行时间同步(有些情况下,内核时钟也可以通过ntp服务器来读取时间)
这两个时钟通常会有一些误差,所以长时间可以导致这两个时钟偏离的比较多,最简单的保持两个时间同步的方法是用软件测出他们之间的误差率,然后用软件进行修正。在每次重新启动系统的时候,系统都会用hwclock命令对时间进行同步。如果内核时钟在每一个时间中断都快或者慢的话,可以用adjtimex命令进行调整,使得RTC和内核时间走的快慢一致。
linux的内核时间实际上是记录从1970年1月1日距离现在的秒数,并且以GMT(格林尼治时间)(或者叫UTC- Coordinated Universal Time)为标准,UTC是不随着DST(夏令时)变换,需要有变化的是由应用程序自身来完成时间的转换。
通常,本地时间=UTC时间+时区
在安装linux系统的时候,可能正确设置了时区,但由于某些原因需要调整的时候,请参考以下方法
利用tzselect命令可以修改系统的当前时区,配置文件储存在/etc/sysconfig/clock文件中(Redhat As3)

linux发行版本中会带有clock(老版本)和hwclock命令,有些还可能安装adjtimex程序,系统在启动的时候会有脚本自动调用 hwclock命令,hwclock命令在设置RTC的时候,可以自动进行时钟偏移校正。注意:如果同时运行其他设置RTC的程序有可能会干扰 hwclock命令的校正功能,因此,运行这些命令的时候请只选择其中一个来运行。
adjtimex 允许用户来调整内核的时间参数,因此可以改变内核时间的速度,可以用hwclock命令来比较出内核时间和RTC时间的偏移率,然后利用adjtimex 命令根据偏移率来对内核时间进行校正,使得内核时间走的快些或者慢些,当经过调整的内核时间跟RTC时间走的同样快的时候,可以把这个命令行写到启动脚本里面,让每次机器启动的时候都可以把内核的时间参数调整正确。

 
因此应该已经清楚,计算机是有两个时钟的,RTC(Real Time Clock)和系统时钟,RTC由电池驱动,始终工作,系统时钟只存在于系统启动后,系统时钟通常比较精确,可以精确到微妙(usec),而RTC时间是始终存在的,可以长期稳定的运行。

通常调整linux系统时间和RTC时间走的一致有很多方法,在存在时间服务器的网络内,可以利用linux系统带的NTP服务来定时同步系统时间,这是个很简便的方法,但当不具备这些条件的时候,利用系统内部提供的时间修正工具同样可以完成这项工作

Redhat linux 系统下有一个工具adjtimex便可以完成此工作

adjtimex是用来显示或者修改linux内核的时间变量的工具,他提供了对与内核时间变量的直接访问功能,可以实现对于系统时间的漂移进行修正。
任何用户都可以用adjtimex命令察看时间变量,但只有root用户才可以更改这些参数


在对系统时间进行调整之前,首先应该知道系统时间和RTC时间到底差了多少,也就是决定系统时间的漂移率,可以通过简单命令来实现

#adjtimex --compare

--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124251642 -0.658092 -0.658092 10000 0
1124251652 -0.659612 -0.001520 10000 0
1124251662 -0.661111 -0.001499 10000 0 10001 3271400
1124251672 -0.662609 -0.001498 10000 0 10001 3263588
1124251682 -0.664108 -0.001499 10000 0 10001 3269838
1124251692 -0.665607 -0.001499 10000 0 10001 3269838
1124251702 -0.667104 -0.001497 10000 0 10001 3257338
1124251712 -0.668605 -0.001501 10000 0 10002 -3269700

结果显示出两个时钟的差别,第一可以看出2nd diff表示系统时间在10秒周期内快了还是慢了几秒种
这里可以看出系统时间在10秒钟内慢了0.001498秒(注意,这里系统会连续测试出好几个连续的差别,一般可以参考平均值)
第二可以看到两个内核参数 tick 和freq 另外,系统也有一个对tick和freq的推荐值,用这个值可以对系统时间进行校正

从上面结果看系统时钟每10秒慢了-0.001xxx秒(相对于RTC时间),利用-t参数可以重新定义系统时间10秒的长度,由于比实际时间(RTC)慢了1微秒多,因此可以
把系统10秒(10000微秒)的长度定义成实际时间的10001微秒,也就是说让系统时间走的快点,也可以说每系统时间走10秒(10000微秒)就快1微秒,从而系统时间跟上
了RTC时间,达到了时间校正的目的

#adjtimex --tick 10001

#adjtimex -c

--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124251994 -0.710396 -0.710396 10001 0
1124252004 -0.710913 -0.000517 10001 0
1124252014 -0.711411 -0.000498 10001 0 10001 3264062
1124252024 -0.711910 -0.000499 10001 0 10001 3270312
1124252034 -0.712413 -0.000503 10001 0 10001 3296875
1124252044 -0.712911 -0.000498 10001 0 10001 3262500
1124252054 -0.713409 -0.000498 10001 0 10001 3264062
1124252064 -0.713908 -0.000499 10001 0 10001 3270312

请注意,时钟的差别已经不到1微秒了,但是还存在大约0.4--0.5微秒的差别,要修正更高单位的差别,-t参数就无能为力了,需要用到偏移量参数-f

请用如下公式决定-f的修正值

f=差值*100000*65536
这里 f=0.000499*100000*65536=3270246.4

#adjtimex -f 3270246

#adjtimex -c

--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124252365 -0.728704 -0.728704 10001 3270246
1124252375 -0.728723 -0.000019 10001 3270246
1124252385 -0.728721 0.000002 10001 3270246 10001 3256184
1124252395 -0.728722 -0.000001 10001 3270246 10001 3278058
1124252405 -0.728721 0.000001 10001 3270246 10001 3262434
1124252415 -0.728723 -0.000002 10001 3270246 10001 3284308
1124252425 -0.728719 0.000004 10001 3270246 10001 3243684
1124252435 -0.728721 -0.000002 10001 3270246 10001 3282746

可以看到两个时间已经非常接近了大约10秒种,会相差大约1-3豪秒(usec)

有关tick 和freq的数值,在suggested列里面已经由程序算出推荐值了,也可以参考推荐值
### 如何将Linux系统安装到移动硬盘 #### 准备工作 在开始之前,需要准备一些必要的工具资源。这些包括一个可用的Ubuntu ISO文件、一台可以运行虚拟机软件(如VMware Workstation或VirtualBox)的计算机以及一块目标移动硬盘[^1]。 #### 创建用于安装的虚拟环境 为了安全起见并减少对现有操作系统的干扰,可以通过创建一个新的虚拟机来模拟整个安装过程: 1. **打开 VMware Workstations 或 VirtualBox** 启动所选的虚拟化平台,并选择“创建新虚拟机”。 2. **配置虚拟机** - 在创建过程中指定操作系统类型为 Linux 版本为 Ubuntu。 - 设置足够的内存 (建议至少 2GB RAM) 及处理器核心数以保证流畅体验。 - 不必分配磁盘空间给此虚拟机;而是指向外部设备——即将要写入数据的目标移动存储介质作为其根分区所在位置[^3]。 #### 开始实际安装流程 一旦上述准备工作完成,则可继续执行真正的系统部署动作: 1. **加载ISO映像至虚拟CD/DVD驱动器** 将下载好的官方发行版镜像挂载上去以便后续引导使用。 2. **调整硬件参数适配实际情况** 如果可能的话, 还需修改某些高级选项比如启用 EFI/UEFI 支持如果主机支持该特性的话; 此外还需要确认网络连接状态良好从而允许在线更新组件等功能正常使用. 3. **启动虚拟实例并按照提示逐步前进直至结束** 4. 当被询问关于目标媒介时,请务必选定先前连接上的便携式SSD/HDD而非内部固定部件以防误操作破坏既有布局结构! 5. 配置完毕之后重启机器验证一切功能运作正常即可拔下装置携带走随时切换不同计算节点之间无缝衔接学习开发任务啦! ```bash sudo fdisk -l # 查看所有磁盘列表,识别出你的移动硬盘 sudo mkfs.ext4 /dev/sdXn # 替换 X n 成具体编号格式化对应区域成为ext4文件系统 mount /dev/sdXn /mnt # 挂载刚才处理过的部分到临时目录方便接下来复制过去必要资料 debootstrap --arch=amd64 focal /mnt http://archive.ubuntu.com/ubuntu/ # 构建基础包集合填充进去形成最小化的桌面或者服务器端形态取决于个人需求偏好设定等等因素综合考量决定最终呈现形式如何取舍权衡利弊得失做出明智抉择达成预期目的成果展现出来供大家参考借鉴学习进步共同成长壮大起来迎接更加美好的未来世界到来吧朋友们加油干啊!!! ``` 以上命令仅为示范性质的实际应用当中应当格外小心谨慎以免发生不可逆损害事件的发生几率降到最低限度范围内去保障整体安全性可靠性稳定性三者兼顾平衡发展才是长久之计哦亲们记住咯😊! --- #### BIOS设置注意事项 确保当物理接入了前述已完成初始化工作的USB接口类别的大容量储存载体后再回到真实世界的PC上面做最后一步关键环节的操作前先核查清楚当前固件菜单里边有没有新增加出来的可供挑选的新项目存在如果没有则返回重新检查前面各个环节是否存在遗漏之处直到满足条件为止再往下推进就不会有问题啦理论上讲只要遵循标准步骤指引就能顺利完成全部预定计划安排事项清单里面的内容罗列无误哈😄 1. **进入BIOS界面**: 通常是在开机瞬间按下 `Del` 键或是 `F2`, 具体按键依据品牌型号有所不同. 2. **更改优先级顺序**, 让外部附加单元排位靠前者获得控制权率先尝试读取加载相关内容进而顺利过渡进入到下一阶段画面显示效果之中去探索未知领域奥秘乐趣无穷尽也😎 3. **保存退出生效即时反映变化情况观察现象特征表现是否符合预期设想模型预测结果一致与否作出相应判断决策采取适当措施纠正偏差恢复正常轨道行驶方向前行不断向前迈进永不停歇追求卓越品质始终如一坚持到底永不放弃信念坚定不渝勇往直前创造辉煌成就属于我们每一个人自己的精彩人生篇章故事传说流传千古万代敬仰怀念追思不已💕 --- ### 总结 通过上述方法能够有效实现将完整的Linux发行版移植到随身携带型的数据保留容器之内随时随地灵活运用不受地域限制约束极大地方便了科研工作者日常办公自动化智能化水平提升效率倍增收益显著增加值得推广普及开来让更多的人受益匪浅感激涕零难以言表唯有付诸行动方能体现真正价值意义非凡超乎想象之外令人叹服折腰膜拜不已👏🎉🎊
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值