二进制文件 Linux /var/log/wtmp

二进制文件 Linux /var/log/wtmp

为什么 Linux 中有些文件是二进制的?例如 /var/log/wtmp 日志?更确切地说,为什么日志是二进制形式的。

答案1

wtmp(和)文件utmp的历史可以追溯到 20 世纪 70 年代,设计者并没有给出太多理由。您可以看到,使用固定长度的记录utmpwtmp记录记帐信息,文本日志文件会使用更多的磁盘空间,并且比仅写入二进制记录花费更多的时间来格式化消息。

进一步阅读(Unix 第 6 版手册页):

还有第一版(没有wtmp 那里):

答案2

“固定大小的记录”有一些好处。所以 utmp/wtmp 记录的历史结构是

struct utmp {
    char    ut_line[8];             /* tty name */
    char    ut_name[8];             /* user id */
    char    ut_host[16];            /* host name, if remote */
    long    ut_time;                /* time on */
};

(那是来自 SunOS 4 机器;我只是选择它,因为它是一个易于阅读的条目)。

这使得将数据附加到文件并以相反的顺序显示它变得很容易,只需向后跳过sizeof(struct utmp)字节即可。这使得像last以相反顺序报告这样的程序变得很容易。

确切的数据结构随着时间的推移而改变,但记录的大小仍然是固定的。

例如,当前的 FreeBSD 机器具有:

struct utmpx {
    short           ut_type;        /* Type of entry. */
    struct timeval  ut_tv;          /* Time entry was made. */
    char            ut_id[8];       /* Record identifier. */
    pid_t           ut_pid;         /* Process ID. */
    char            ut_user[32];    /* User login name. */
    char            ut_line[16];    /* Device name. */
#if __BSD_VISIBLE
    char            ut_host[128];   /* Remote hostname. */
#else
    char            __ut_host[128];
#endif
    char            __ut_spare[64];
};

utmp和的另一个优点lastlog是能够文件。

例如,使用lastlog(该finger命令用于显示上次登录时间)数据存储在基于uid* 的偏移量处sizeof(struct lastlog)。这样您就可以通过查找计算出的位置,快速轻松地找到uid 12345678的最后登录时间。

对于文本文件,这些好处不存在;每条记录的宽度都是可变的或者必须被填充。结果更大,更难处理,可能需要解析(long ut_time比尝试解析 ASCII 日期字符串更容易处理)。

ASCII 对于人类和人类可能需要操作的数据来说非常有用。二进制(有时)对于程序来说更好,特别是对于人类不一定需要看到的原始数据。

相关内容