/var/lib/dpkg/lock은 어떻게 작동하나요?

/var/lib/dpkg/lock은 어떻게 작동하나요?

/var/lib/dpkg/lock은 "패키지 관리자가 작동하는 동안" 잠금을 유지하는 파일입니다. 그런데 이 시스템은 어떻게 작동하나요? Linux를 사용할 때마다 /var/lib/dpkg/lock이 있습니다. dpkg의 패키지 관리자 중 하나를 사용할 때 변경 사항이 없습니다. 그래서 실제로 무엇을 하는지 볼 수 없습니다.

답변1

확실하지는 않지만 flock().system 호출을 통해 flock()파일에 권고 잠금을 생성할 가능성이 높습니다. 다른 응용 프로그램이 파일에 대한 잠금을 얻으려고 시도하면 커널은 원래 잠금이 사라질 때까지 차단하거나 옵션이 제공 EWOULDBLOCK되면 LOCK_NB반환됩니다 . 이 잠금 메커니즘을 사용하면 잠긴 파일을 삭제하고 다시 만들지 않고도 사용할 수 있습니다.

업데이트: 소스를 확인하고 잠금을 권장하지만 직접 사용하지 않는 것으로 확인되었습니다 flock(). fcntl사용:

쿼리.c:

        if (modstatdb_is_locked())
          puts(_(
"Another process has locked the database for writing, and might currently be\n"
"modifying it, some of the following problems might just be due to that.\n"));
        head_running = true;
      }

DB수정.c:

modstatdb_is_locked(void)
{
  int lockfd;
  bool locked;

  if (dblockfd == -1) {
    lockfd = open(lockfile, O_RDONLY);
    if (lockfd == -1)
      ohshite(_("unable to open lock file %s for testing"), lockfile);
  } else {
    lockfd = dblockfd;
  }

  locked = file_is_locked(lockfd, lockfile);

  /* We only close the file if there was no lock open, otherwise we would
   * release the existing lock on close. */
  if (dblockfd == -1)
    close(lockfd);

  return locked;
}

파일.c:

file_is_locked(int lockfd, const char *filename)
{
    struct flock fl;

    file_lock_setup(&fl, F_WRLCK);

    if (fcntl(lockfd, F_GETLK, &fl) == -1)
        ohshit(_("unable to check file '%s' lock status"), filename);

    if (fl.l_type == F_WRLCK && fl.l_pid != getpid())
        return true;
    else
        return false;
}

dpkg.h:

#define LOCKFILE          "lock"

fcntl맨페이지 에서 :

   Advisory locking
       F_GETLK,  F_SETLK  and  F_SETLKW  are  used to acquire, release, and test for the existence of record locks (also known as file-segment or file-region locks).  The third
       argument, lock, is a pointer to a structure that has at least the following fields (in unspecified order).

답변2

dpkg항상 사용fcntl(2)기록 잠금을 참조하세요. 이는 잠금이 프로세스와 연관되어 있으므로 잠금 파일이~ 해야 하다dpkg절대로 삭제하면 안 됩니다. 그렇지 않으면 두 개 이상의 인스턴스가 동시에 실행되어 데이터베이스나 파일 시스템이 손상 될 수 있습니다 .

이것은언제나dpkg잠금 파일을 삭제하는 것을 고려하는 것보다 결국 필요한 경우 실행 중인 인스턴스를 종료하는 것이 좋습니다( dpkg갑자기 전체 시스템 충돌 및 갑작스러운 종료에 저항해야 하며 결과 문제는 수정이 필요한 심각한 버그로 처리되므로).

이 내용은 다음과 같이 기록됩니다.dpkg 프런트엔드 사양, 그리고dpkg FAQ.

답변3

내가 아는 한,포장 백/var/lib/dpkg/lock잠금 파일 사용자물쇠 남편(3) 순서대로 사용포캉트르(2).

$ sudo strace dpkg -r somepackage 2>&1 |
> grep F_SETLKW
fcntl64(5, F_SETLKW64, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0

이는 다음을 사용하여 셸에서 파일을 잠글 수 없음을 의미합니다.그룹(1), 이것이 호출되기 때문에그룹(2)는 많은 시스템에서 해당되지 않습니다.기능잠그다.

$ sudo strace flock -x /var/lib/dpkg/lock 2>&1 |
> grep 'flock('
flock(3, LOCK_EX)

그러나 다음 명령을 사용하여 파일을 잠글 수 있습니다.잠그기 전프로그램이나이 Python 스크립트, 둘 다 호환 가능한 잠금을 획득합니다.

관련 정보