/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 스크립트, 둘 다 호환 가능한 잠금을 획득합니다.