Hodiny spravované linuxovým jádrem nejsou stejné jako hardwarové hodiny.
Hardwarové hodiny běží, i když vypnete systém.
Hardwarové hodiny se také nazývají hodiny systému BIOS. Datum a čas hardwarových hodin můžete změnit v systému BIOS.
Když je však systém v provozu, stále můžete zobrazit a nastavit datum a čas hardwaru pomocí příkazu hwclock pro Linux, jak je vysvětleno v tomto tutoriálu.
1. Zobrazte datum a čas hardwarových hodin
Stačí zadat hwclock, který zobrazí datum a čas hardwarových hodin vašeho systému. Toto je stejné datum a čas, které uvidíte na obrazovce systému BIOS. Můžete také použít volbu -r nebo -show pro zobrazení data a času.
# hwclock Sat 10 Aug 2013 08:26:12 AM PDT -0.312862 seconds # hwclock -r Sat 10 Aug 2013 08:20:54 AM PDT -0.109748 seconds # hwclock --show Sat 10 Aug 2013 08:21:12 AM PDT -0.640982 seconds
Poznámka:Výstup příkazu date může být stejný jako výstup příkazu hwclock (ve skutečnosti by měl být stejný). Příkaz date však získává datum a čas z hodin spravovaných z jádra Linuxu. V tomto příkladu je mezi nimi rozdíl asi 10 minut.
# date Sat Aug 10 08:11:21 PDT 2013
2. Zkopírovat čas systému do času hardwaru
Opravdu se chcete ujistit, že vaše hardwarové hodiny mají stejné datum a čas jako systémové.
Jak nyní vidíte, existuje rozdíl mezi systémovými hodinami a časem hardwarových hodin.
# date Sat Aug 10 08:16:17 PDT 2013 # hwclock Sat 10 Aug 2013 08:26:53 AM PDT -0.687841 seconds
Takže pomocí příkazu hwclock, jak je znázorněno níže, nastavte hardwarové hodiny stejně jako systémové hodiny. Toto je typické použití příkazu hwclock.
# hwclock -w # hwclock Sat 10 Aug 2013 08:16:27 AM PDT -0.625382 seconds # date Sat Aug 10 08:16:28 PDT 2013
Poznámka:Obě volby -w a –systohc dělají totéž. Rád používám –systohc, protože je snadno zapamatovatelný. –systohc je zkratka pro „system to hardwarové hodiny“, což kopíruje čas ze systémových na hardwarové hodiny.
# hwclock --systohc
3. Nastavte datum a čas hardwarových hodin ručně
Namísto kopírování systémového data a času do hardwarových hodin můžete hodnotu také nastavit ručně pomocí možnosti –set a –date, jak je uvedeno níže.
Následující nastaví datum na 11. srpna 2013. Upozorňujeme, že pokud neuvedete čas, bude nastaven na 00:00.
# hwclock --set --date 8/11/2013 # hwclock Sun 11 Aug 2013 12:00:04 AM PDT -0.703489 seconds
Můžete také nastavit datum a čas současně, jak je uvedeno níže. Upozorňujeme, že ve výchozím nastavení bude používat místní čas.
# hwclock --set --date "8/11/2013 23:10:45" # hwclock Sun 11 Aug 2013 11:10:48 PM PDT -0.562862 seconds
Můžete také vzít výstup příkazu date a předat jej volbě –set a –date, jak je uvedeno níže.
# hwclock --set --date "Sat Aug 10 08:31:24 PDT 2013" # hwclock Sat 10 Aug 2013 08:31:28 AM PDT -0.594118 seconds
4. Zkopírujte čas hardwaru do systémového času
Když vaše hardwarové hodiny ukazují správné datum a čas, ale ne vaše systémové hodiny, můžete použít volbu -s, jak je uvedeno níže, a zkopírovat hardwarový čas do systémového času, jak je znázorněno níže.
# hwclock Sat 10 Aug 2013 08:20:28 AM PDT -0.687872 seconds # date Sat Aug 10 08:34:48 PDT 2013 # hwclock -s # date Sat Aug 10 08:20:55 PDT 2013
Poznámka:Volba -s i –hctosys dělá totéž. Rád používám –hctosys, protože je snadno zapamatovatelný. –hctosys znamená „hardware clock to system“, což kopíruje čas z hardwarových hodin do systémových.
# hwclock -hctosys
Pokud jste si při testování popletli systémový čas, můžete pomocí příkladů příkazu date nastavit správné datum a čas.
5. hwclock režim ladění
Když hwclock předáte volbu –debug, zobrazí se nějaké informace o ladění, které přesně ukazují, co příkaz hwclock dělá.
Následující text přesně ukazuje, co dělá, když zkopírujeme systémový čas do hardwarového času.
# hwclock --systohc --debug hwclock from util-linux-ng 2.17.2 Using /dev interface to clock. Last drift adjustment done at 1375974983 seconds after 1969 Last calibration done at 1375974983 seconds after 1969 Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2013/08/10 15:16:37 Hw clock time : 2013/08/10 15:16:37 = 1375974997 seconds since 1969 Time elapsed since reference time has been 0.009002 seconds. Delaying further to reach the new time. Setting Hardware Clock to 15:16:37 = 1375974997 seconds since 1969 ioctl(RTC_SET_TIME) was successful. Not adjusting drift factor because it has been less than a day since the last calibration.
Následující text přesně ukazuje, co dělá, když kopírujeme čas hardwaru do systémového času.
# hwclock -hctosys --debug hwclock from util-linux-ng 2.17.2 Using /dev interface to clock. Last drift adjustment done at 1375975224 seconds after 1969 Last calibration done at 1375975224 seconds after 1969 Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2013/08/10 15:23:20 Hw clock time : 2013/08/10 15:23:20 = 1375975400 seconds since 1969 Calling settimeofday: tv.tv_sec = 1375975400, tv.tv_usec = 0 tz.tz_minuteswest = 420
Poznámka:Na počítačích alfa můžete použít getepoch k zobrazení epochy, setepoch k nastavení epochy. Když se to pokusíte spustit na počítači Alpha, zobrazí se následující chybový stroj.
# hwclock --setepoch --epoch=1952 The kernel keeps an epoch value for the Hardware Clock only on an Alpha machine. This copy of hwclock was built for a machine other than Alpha (and thus is presumably not running on an Alpha now). No action taken.
6. Upravte hardwarové hodiny
Když se systém spustí, bere čas z hardwarových hodin. Soubor /etc/adjtime používá možnost hwclock –adjust k řízení úprav.
# hwclock --adjust
Soubor /etc/adjtime má následující tři řádky.
# cat /etc/adjtime -3.019877 1375975224 0.000000 1375975224 UTC
- Tři hodnoty v 1. řádku představují 1) systematickou rychlost posunu v sekundách za den, 2) počet sekund od poslední úpravy v roce 1969 UTC 3) pouze 0
- Řádek 2 je stejná hodnota, jakou vidíte na 1. řádku a 2. hodnotě. tj. počet sekund od roku 1969 UTC poslední úpravy
- Řádek 3 bude obsahovat UTC nebo LOCAL
7. hwclock testovací režim
Když změníte věci pomocí hwclock pomocí volby –test, můžete příkaz spustit, aniž byste skutečně provedli nějaké změny.
Možnost –systz odpovídajícím způsobem změní systémové časové pásmo. Ale protože jsme dali –test, ve skutečnosti neprovede změnu, ale stále provede příkaz bez jakýchkoli problémů.
# hwclock --systz --test Not setting system clock because running in test mode.
Nejlepší využití testovacího režimu je, když jej zkombinujete s možností ladění. T.j. když chcete vidět, co dělá příkaz hwclock, ale bez provedení jakýchkoli změn.
# hwclock --systz --test --debug hwclock from util-linux-ng 2.17.2 Last drift adjustment done at 1375975224 seconds after 1969 Last calibration done at 1375975224 seconds after 1969 Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Current system time: 1375975586 = 2013/08/10 15:26:26 Calling settimeofday: UTC: 2013/08/10 15:26:26 tv.tv_sec = 1375975586, tv.tv_usec = 556277 tz.tz_minuteswest = 420 Not setting system clock because running in test mode.
Následující text přesně ukazuje, co dělá volba –adjust, aniž by skutečně prováděla jakékoli úpravy.
# hwclock --adjust --test --debug hwclock from util-linux-ng 2.17.2 Using /dev interface to clock. Last drift adjustment done at 1375975224 seconds after 1969 Last calibration done at 1375975224 seconds after 1969 Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2013/08/10 15:30:35 Hw clock time : 2013/08/10 15:30:35 = 1375975835 seconds since 1969 Time since last adjustment is 611 seconds Need to insert -1 seconds and refer time back 0.978644 seconds ago Needed adjustment is less than one second, so not setting clock.