Определите текущий часовой пояс по умолчанию, установленный во FreeBSD

Вот ваш лучший вариант:

Используйте sudo hwinfo --framebuffer , как описано, выберите видеорежим, который вы хотите видеть во время загрузки в консоли, затем добавьте option vga = nnn в параметры загрузки ядра.

Единственная уловка заключается в том, что nnn - это режим видео, который вы выбрали из списка, созданного hwinfo - ПРЕОБРАЗОВАННЫЙ В ДЕСЯТИЧНОЕ !!!

Если вы попробуете vga = 0xwhatever , это не сработает.

Например, я выбрал видеорежим 0x307 (1280x1024 (+1280), 8 бит), я преобразовал 0x307 в десятичное, что составляет 775, а затем я использовал vga = 775 в параметрах загрузки isolinux / extlinux .

Вы можете использовать printf для преобразования шестнадцатеричного числа в десятичное: $ printf "% d \ n" 0x307 775

И У меня с самого начала был красивый мелкий текст на всех приставках.

Успех!

1
09.12.2018, 08:06
4 ответа

Текущий часовой пояс по умолчанию, используемый в FreeBSD, а также в OpenBSD и NetBSD, будет очевиден из проверки символической ссылки /etc/localtime. Он будет указывать на файл определения часового пояса в /usr/share/zoneinfo.

Например:

$ ls -l /etc/localtime
lrwxr-xr-x  1 root  wheel  36 Aug 11 13:51 /etc/localtime -> /usr/share/zoneinfo/Europe/Stockholm
1
27.01.2020, 23:18

Ответ TLDR::

$ POSIXTZ=$(tail -n1 /etc/localtime)
$ echo $POSIXTZ
CET-1CEST,M3.5.0,M10.5.0/3

$ TZNAME=$(find /usr/share/zoneinfo | while read fname; do cmp -s /etc/localtime "$fname" && echo "$fname" | cut -c 21- ; done)
$ echo $TZNAME
Europe/Copenhagen

Текущий часовой пояс хранится в файле /etc/localtime. Как отмечает @Kusalananda, это может быть символической ссылкой. Но, как намекает @JdeBP, во FreeBSD этот файл обычно копируется из /usr/share/zoneinfoво время установки.

Эти файлы взяты из текстовых описаний в contrib/tzdata

Затем эта информация компилируется в двоичный формат с использованием zic , формат указывается в tzfile

Я не знаю встроенной утилиты, которая непосредственно разбирает этот файл. Но писать на C должно быть легко, имея под рукой документацию. Если мы хотим придерживаться того, что выходит из коробки, мы можем посмотреть на это, используя hexdump.

hexdump -v -C /etc/localtime

Или если мы просто хотим посмотреть на магический маркер:

$ hexdump -v -s 0 -n 5 -e '1/5 "%s\n"' /etc/localtime
TZif2

Или поля:

tzh_ttisgmtcnt  The number  of UTC/local indicators stored in the file.
tzh_ttisstdcnt  The number  of standard/wall indicators stored in the file.
tzh_leapcnt     The number  of leap seconds for which data is stored in the file.
tzh_timecnt     The number  of ``transition times'' for which data is stored in the file.
tzh_typecnt     The number  of ``local time types'' for which data is stored in the file (must not be zero).
tzh_charcnt     The number  of characters of ``time zone abbreviation strings'' stored in the file.

Использование:

hexdump -v -s 19 -n 4 -e '"tzh_ttisgmtcnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 23 -n 4 -e '"tzh_ttisstdcnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 27 -n 4 -e '"tzh_leapcnt:    " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 31 -n 4 -e '"tzh_timecnt:    " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 35 -n 4 -e '"tzh_typecnt:    " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 39 -n 4 -e '"tzh_charcnt:    " 1/4 "%9u\n"' /etc/localtime

Результаты в моем случае:

tzh_ttisgmtcnt:         0
tzh_ttisstdcnt:         6
tzh_leapcnt:            6
tzh_timecnt:            0
tzh_typecnt:          133
tzh_charcnt:            6

Затем мы выполняем следующую математику, чтобы выяснить, где начинается первый ttinfo:

43 + (tzh_timecnt * 4) + (tzh_timecnt * 1)
43 + (0 * 4) + (0 * 1) = 43

Колеса медленно падают:

$ hexdump -v -s 43 -n 6 -e '"ttinfo:\n tt_gmtoff:      " 1/4 "%9u\n tt_isdst:       " 1/1 "%1d\n tt_abbrind:     " 1/1 "%1u\n"' /etc/localtime
ttinfo:
 tt_gmtoff:      2350816009
 tt_isdst:       96
 tt_abbrind:     155

С этими цифрами я, наверное, немного ошибся. И это действительно мазохистский способ справиться с этим. Так что я остановился, едва найдя золото, используяtt_abbrind

Но если мы посмотрим в конец спецификации tzfile , мы найдем этот маленький самородок:

After the second header and data comes a newline-enclosed, POSIX-TZ-environment- variable-style string for use in handling instants after the last transi- tion time stored in the file (with nothing between the newlines if there is no POSIX representation for such instants).

Так что это так же просто, как:

$ tail -n1 /etc/localtime
CET-1CEST,M3.5.0,M10.5.0/

Если вы присмотритесь, то заметите, что /etc/localtimeне содержит настроек Continent/Region! Но поскольку файл копируется из /usr/share/zoneinfo, вы можете сравнить их и найти вероятный файл. Я не копался достаточно глубоко, чтобы подтвердить, что /usr/share/zoneinfoможет содержать дубликаты. Но для меня -это прекрасно работает:

$ find /usr/share/zoneinfo | while read fname; do cmp -s /etc/localtime "$fname" && echo "$fname" | cut -c 21- ; done
Europe/Copenhagen

Мы перебираем все файлы в /usr/share/zoneinfoи сравниваем каждый из них с /etc/localtime. cmpс использованием параметра -sничего не отобразит, а выйдет только с использованием значения. Если значение равно нулю, мы напечатаем имя.При печати имени мы используем cut, чтобы удалить первые 21 символ, чтобы получитьContinent/Region

5
27.01.2020, 23:18

Простое межплатформенное решение — использовать date!

$ date +"%Z"
CET
$ date +"%z"
+0100

В вашем случае вы, вероятно, снова получите PST -, но я думаю, что этот ответ также важен для тех, кто может с этим согласиться. Это следует учитывать, если в среде установлен TZ. И в практическом использовании -смещение часто более удобно, чем Continent/Region.

1
27.01.2020, 23:18

Если часовой пояс был установлен с помощью tzsetup, то имя текущего часового пояса сохраняется в /var/db/zoneinfo:

.
$ sudo tzsetup Europe/Berlin                                                                                                                                                                                  
$ cat /var/db/zoneinfo                                                                                                                                                        
Europe/Berlin

Это позволяет переустановить файл часового пояса/etc/localtime:

$ sudo rm /etc/localtime                                                                                                                                                      
$ sudo tzsetup -r                                                                                                                                                             
$ ls -l /etc/localtime                                                                                                                                                        
-r--r--r--  1 root  wheel  2309 Feb 15 10:59 /etc/localtime

Если файл часового пояса был скопирован вручную, а не с помощью tzsetup, вам необходимо найти имя соответствующего исходного файла, как объяснил Клаус Андерсен:

$ cd /usr/share/zoneinfo && find. -type f -exec cmp -s /etc/localtime '{}' \; -print | sed 's,^\./,,'                                                                        
Europe/Berlin

Я тестировал это с FreeBSD версий 11.3 и 12.1.

2
15.02.2020, 09:32

Теги

Похожие вопросы