Автоматически ли Linux очищает сокеты абстрактных доменов?

Вы не видите реальную сумму всей записи от iotop.

  1. iotop номер строки ограничен Вашей терминальной высотой, процессы, возможно, отодвигают экран другими процессами с более свежими операциями ввода-вывода.
  2. Процессы, которые записали в диск, затем законченный, не останутся в списке. (например, httpd мечут икру/разветвляют процесс. Основа на PID httpd, Я уже верю многим из httpd выхода дочернего процесса.)

Проверьте размер httpd файлов журнала, я полагаю, что размер должен показать значимое увеличение.

JBD2: http://en.wikipedia.org/wiki/JBD2

Кавычка обзора из Википедии:

Журналирование блочного устройства (JBD) обеспечивает независимый от файловой системы интерфейс для журналирования файловой системы. ext3, ext4 и OCFS2, как известно, используют JBD. OCFS2, начинающие с Linux 2.6.28 и ext4, используют ветвление JBD под названием JBD2

15
23.05.2017, 15:40
2 ответа

Вторая возможность состоит в том, чтобы загрузить исходный код из восходящего потока напрямую вместо того, чтобы загружать его из репозиториев Debian. Это имеет то преимущество, что если вы не только хотите прочитать исходный код, но и хотите изменить что-то, что вы можете непосредственно зафиксировать и отправить в upstream (предполагая, что это не исправление Debian).

URL-адрес хранилища исходного кода в восходящем направлении обычно можно найти в файле /usr/share/doc/$ пакета _ или _ program _ name/copyright .

$ head /usr/share/doc/git/copyright

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Contact: git@vger.kernel.org
Source: https://www.kernel.org/pub/software/scm/git/

Files: *
Copyright: © 2005-2014, Linus Torvalds and others.
License: GPL-2

Files: xdiff/*
Copyright: © 2003-2009, Davide Libenzi, Johannes E. Schindelin

На этот файл также ссылается packages.debian.org (поиск «Файл авторских прав»).

-121--50247-

Обратите внимание, что невозможно изменить образ ISO: эта файловая система предназначена только для чтения. Необходимо извлечь изображение, изменить файлы, а затем создать новое изображение. Я уверен, что есть программное обеспечение для этого в Windows, но я не знаю, какое.

Вы можете попытаться манипулировать файлами с помощью утилит Cygwin . Initrd - образ файловой системы, обычно ext2, для которого нет хорошей поддержки в Windows. Однако в настоящее время файл, скорее всего, будет представлять собой initramfs , даже если он называется initrd-SOMETHING , а initramfs - это cpio архив, которым можно манипулировать с помощью команды cpio в Cygwin или других портах Windows утилит Linux.

Если вы не знаете точно, что вы делаете, это, скорее всего, сложный процесс, включающий в себя проб и ошибок. Вместо этого рекомендуется установить один и тот же дистрибутив Linux на виртуальной машине ( VirtureBox удобен для этого случая использования) и использовать средства, предоставляемые этим дистрибутивом, для изменения его образа загрузки. Весьма вероятно, что это самый простой и наименее трудоемкий метод.

-121--185414-

Да, linux автоматически «очищает» абстрактные сокеты до такой степени, что уборка даже имеет смысл. Вот минимальный рабочий пример, с помощью которого можно проверить это:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int
main(int argc, char **argv)
{
  int s;
  struct sockaddr_un sun;

  if (argc != 2 || strlen(argv[1]) + 1 > sizeof(sun.sun_path)) {
    fprintf(stderr, "usage: %s abstract-path\n", argv[0]);
    exit(1);
  }

  s = socket(AF_UNIX, SOCK_STREAM, 0);
  if (s < 0) {
    perror("socket");
    exit(1);
  }
  memset(&sun, 0, sizeof(sun));
  sun.sun_family = AF_UNIX;
  strcpy(sun.sun_path + 1, argv[1]);
  if (bind(s, (struct sockaddr *) &sun, sizeof(sun))) {
    perror("bind");
    exit(1);
  }
  pause();
}

Запустите эту программу как ./a.out/test-socket & , затем запустите ss-ax | grep test-socket , и вы увидите используемый сокет. Затем убейте% ./a.out , и ss -ax покажет, что сокет исчез.

Однако причина, по которой вы не можете найти эту очистку в какой-либо документации, заключается в том, что она на самом деле не очищается в том же смысле, что неабстрактные сокеты unix-домена нуждаются в уборке. Неабстрактный сокет фактически выделяет inode и создает запись в каталоге, которую необходимо очистить в базовой файловой системе. В отличие от этого, следует думать об абстрактном сокете, который больше похож на номер порта TCP или UDP. Конечно, если привязать TCP-порт, а затем выйти, этот TCP-порт будет снова свободен. Но любое 16-битное число, которое вы использовали, существует абстрактно и всегда. Пространство имен номеров портов 1-65535 и никогда не изменяется и не нуждается в уборке.

Просто подумайте об абстрактном имени сокета, например, о номере порта TCP или UDP,Вы не можете связать один и тот же номер порта дважды (запрет SO _ REUSEADDR или SO _ REUSEPORT ). Но закрытие сокета (явно или неявно путем завершения) освобождает порт, не оставляя ничего для очистки.

5
27.01.2020, 19:50

Я разместил этот вопрос более года назад и никогда не был полностью удовлетворен отсутствием окончательной документации. Я подумал, что снова проверю документацию Linux на наличие обновлений, и был счастлив увидеть это :

Абстрактные сокеты

Разрешения на сокеты не имеют значения для абстрактных сокетов: процесс umask (2) имеет не влияет на привязку абстрактного сокета, а изменение владельца и разрешений объекта (через fchown (2) и fchmod (2)) не влияет на доступность сокета.

Абстрактные сокеты автоматически исчезают, когда все открытые ссылки на сокет закрываются.

Кроме того, Интерфейс программирования Linux , автор Майкл Керриск , охватывает этот вопрос (перекрестная ссылка из , этот другой ответ ):

57.6 Краткое изложение Linux Пространство имен сокетов

Так называемое абстрактное пространство имен - это особенность Linux, которая позволяет нам привязать сокет домена UNIX к имени без создания этого имени в файловой системе. Это дает несколько потенциальных преимуществ:

  • Нам не нужно беспокоиться о возможных конфликтах с существующими именами в файловой системе.
  • Нет необходимости отключать путь к сокету, когда мы закончили использовать сокет. Абстрактное имя автоматически удаляется при закрытии сокета.
  • Нам не нужно создавать путь в файловой системе для сокета. Это может быть полезно в среде chroot или если у нас нет доступа на запись в файловую систему.

Чтобы создать абстрактную привязку, мы указываем первый байт поля sun_path как нулевой байт (\ 0). [...]

Я считаю, что вместе с ответом @ user3188445 это очень точно проясняет вопрос.

Тем не менее, здесь все еще сделано предположение, что все открытые сокеты для процессов SIGKILL будут закрыты. Это кажется разумным предположением, но у меня нет документации, определяющей такое поведение.

5
27.01.2020, 19:50

Теги

Похожие вопросы