바이너리 Linux /var/log/wtmp [닫기]

바이너리 Linux /var/log/wtmp [닫기]

일부 파일이 Linux 바이너리인 이유는 무엇입니까? 예를 들어 /var/log/wtmp 로그? 보다 정확하게는 로그가 바이너리 형식인 이유입니다.

답변1

wtmp(및) 파일의 utmp날짜는 1970년대로 거슬러 올라가며 디자이너는 별다른 이유를 밝히지 않았습니다. 고정 길이 레코드를 사용하여 회계 정보를 기록 utmp하면 wtmp텍스트 로그 파일은 바이너리 레코드를 작성하는 것보다 더 많은 디스크 공간을 사용하고 메시지 형식을 지정하는 데 더 많은 시간이 소요된다는 것을 알 수 있습니다 .

추가 자료(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];
};

utmpand의 또 다른 장점은 다음 lastlog과 같은 능력입니다.부족한문서.

예를 들어 lastlog(이 finger명령은 마지막 로그인 시간을 표시하는 데 사용됨) 데이터를 사용하면 uid* 기준으로 오프셋 에 저장됩니다 sizeof(struct lastlog). 이렇게 하면 계산된 위치를 조회하여 uid 12345678의 마지막 로그인 시간을 빠르고 쉽게 찾을 수 있습니다.

텍스트 파일의 경우 이러한 이점은 존재하지 않습니다. 각 레코드의 너비는 가변적입니다.또는채워져야 합니다. 결과는 더 크고 처리하기가 더 어렵고 구문 분석이 필요할 수 있습니다( long ut_timeASCII 날짜 문자열을 구문 분석하는 것보다 처리하기가 더 쉽습니다).

ASCII는 사람과 사람이 조작해야 하는 데이터에 적합합니다. 바이너리는 (때때로) 프로그램에 더 적합하며, 특히 인간이 반드시 볼 필요가 없는 원시 데이터의 경우 더욱 그렇습니다.

관련 정보