/var/lib/dpkg/lockはどのように機能しますか?

/var/lib/dpkg/lockはどのように機能しますか?

/var/lib/dpkg/lock は、「パッケージマネージャが動作している間」ロックを保持するファイルです。しかし、このシステムはどのように機能しますか? Linuxを使用するたびに/var/lib/dpkg/lockがあります。 dpkgのパッケージマネージャの1つを使用しても変更はありません。だから実際に何をしているのかはわかりません。

答え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スクリプト、どちらも互換性のあるロックを取得します。

関連情報