/var/lib/dpkg/lock 如何工作?

/var/lib/dpkg/lock 如何工作?

/var/lib/dpkg/lock 是在“包管理器正在工作”时持有锁的文件。但这个系统是如何运作的呢?每次当我使用 Linux 时,我都会有 /var/lib/dpkg/lock 。当我使用 dpkg 的包管理器之一时,我没有进行任何更改。所以我看不到它的实际作用。

答案1

我不确定,但这很可能是通过flock().系统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;
      }

dbmodify.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 常见问题解答

答案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

这意味着您无法使用 shell 从 shell 锁定文件(1),因为这调用(2),在许多系统中不与功能锁。

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

但是,您可以使用以下命令锁定文件带锁前程序或这个Python脚本,两者都获取兼容的锁。

相关内容