VFAT, Linux :После перезагрузки отображаются неверные временные метки файлов

Кто-то ответил на этот вопрос на форумах Debian:http://forums.debian.net/viewtopic.php?f=10&t=141915&p=698118#p698118

Шаги :1. Войдите в систему как пользователь root или загрузитесь в однопользовательском режиме (, что предлагается в сообщении ). 2. Запустите 'Xorg -configure'; это создает файл с именем xorg.conf.new. 3. Скопируйте этот файл в /usr/share/X11/xorg.conf.d/xorg.conf

2
22.03.2021, 20:33
1 ответ

Похоже, что проблема заключается в самом ядре Linux, поскольку часовой пояс может (и обычно )различается между ядром и пользовательским пространством . Файл time.cв kernel/timeв дереве исходных кодов ядра Linux содержит (и экспортирует )struct timezone sys_tz, который затем используется в fs/fat/misc.cв соответствии со временем FAT < -> UNIX. Поле tz_minuteswestэтой структуры используется для отображения разницы между текущим часовым поясом и временем UTC, и оно принимается во внимание, если параметр tz=UTC, а не , переданный команде mount.vfat. Однако для вышеупомянутого поля по умолчанию установлено значение 0. Как объяснено здесь ,

Under Linux, there are some peculiar "warp clock" semantics associated with the settimeofday() system call if on the very first call (after booting) that has a non-NULL tz argument, the tv argument is NULL and the tz_minuteswest field is nonzero. (The tz_dsttime field should be zero for this case.) In such a case it is assumed that the CMOS clock is on local time, and that it has to be incremented by this amount to get UTC system time. No doubt it is a bad idea to use this feature.

Таким образом, единственный способ заставить ядро ​​(и его драйверы )всегда видеть правильный часовой пояс — это вызвать settimeofday()с аргументом tz, где tz.tz_minuteswest— необходимое смещение времени «до запад" в часах относительно UTC (, т.е. -60 для CET и т. д. )и tz_dsttimeустанавливаются на 0 после каждой загрузки системы. Этого можно добиться, установив (любым способом )системный часовой пояс на текущий часовой пояс после изменения его на какой-либо другой (т.е. UTC ), поскольку инструменты командной строки sa timedatectlобычно не выполняют фактическую смену часового пояса, если желаемый часовой пояс совпадает с текущим. Следующий код был создан для доказательства этой концепции:

#include <sys/time.h>
#include <stdio.h>

int main()
{
    struct timeval tv;
    struct timezone tz;
    int ret = gettimeofday(&tv, &tz);
    printf("%d, %dr\n", tz.tz_minuteswest, tz.tz_dsttime);
    return ret;
}

Это выполнение кода было следующим:

$gcc testtz.cpp -o testtz
$./testtz
minuteswest: 0, dsttime: 0r
$timedatectl set-timezone Europe/Vienna
$./testtz
minuteswest: 0, dsttime: 0r
$timedatectl set-timezone UTC
$timedatectl set-timezone Europe/Vienna
$./testtz
minuteswest: -60, dsttime: 0r

Эта проблема не исчезнет в ближайшее время,хотя использование структуры timezoneсчитается устаревшим. Итак, для моей проблемы я рассмотрю использование опции time _offset=minutes из mount.vfat.

2
28.04.2021, 22:57

Теги

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