Gzip большая сумма symlinked файлов

Выполнение ifconfig самостоятельно предоставляет только список интерфейсов, которые произошли, т.е. интерфейсы, которые так или иначе уже настроены.

Видеть все использование интерфейсов ifconfig -a или ip address show

4
17.06.2014, 02:15
2 ответа

Быстрая проверка источника gzip (в частности, gzip 1.6, входящего в Ubuntu 14.04), показывает, что наблюдаемое поведение исходит от функции open_and_stat, начинающейся в строке 1037 gzip.c:

static int
open_and_stat (char *name, int flags, mode_t mode, struct stat *st)
{
  int fd;

  /* Refuse to follow symbolic links unless -c or -f.  */
  if (!to_stdout && !force)
    {
      if (HAVE_WORKING_O_NOFOLLOW)
        flags |= O_NOFOLLOW;
      else
        {
#if HAVE_LSTAT || defined lstat
          if (lstat (name, st) != 0)
            return -1;
          else if (S_ISLNK (st->st_mode))
            {
              errno = ELOOP;
              return -1;
            }
#endif
        }
    }

  fd = OPEN (name, flags, mode);
  if (0 <= fd && fstat (fd, st) != 0)
    {
      int e = errno;
      close (fd);
      errno = e;
      return -1;
    }
  return fd;
}

Обратите внимание, что в строке комментария указано, что gzip не будет следовать за симлинками, если не будет вызвана с флагами -c или -f, а внутри #if ... #endif переменная errno установлена в ELOOP (слишком много встречающихся символических ссылок), если файл, который нужно сжать, на самом деле является сим-ссылкой.

Теперь, из man-страницы gzip(1), флаги -c и -f:

 -c --stdout --to-stdout
 Записывайте на стандартный вывод; сохраняйте исходные файлы без изменений. Если есть
 несколько входных файлов, вывод состоит из последовательности независимых COM-
 членов, находящихся под давлением. Чтобы получить лучшее сжатие, сконцентрируйте все входные файлы.
 прежде чем сжимать их.


 -f - сила
 Принудительное сжатие или распаковка, даже если файл имеет несколько ссылок или
 соответствующий файл уже существует, или если сжатые данные считываются из или
 написанное на терминале. Если входные данные не в формате, распознаваемом gzip,
 и если также указана опция --stdout, скопируйте входные данные без изменения на
 стандартный выход: пусть zcat ведет себя как кошка. Если -f не дано, а когда нет.
 запущенный в фоновом режиме, gzip запрашивает подтверждение того, что существующий файл
 должны быть перезаписаны.

Собрав все вместе, вернемся к первоначальному вопросу:

  • Первый пример не удался, потому что он пытается сжать реальную сим-ссылку (даже если это а не реальный цикл ссылок)
  • Во втором используется флаг -c, поэтому он читает содержимое исходного файла, а затем записывает сжатый вывод в stdout, так что все получается.
  • Третий сценарий использует -f вместо -c. В этом случае gzip не жалуется, когда пытается сжать симлинк, но при распаковке он становится обычным файлом, как показано на рисунке:
$ ls -l
total 4
-rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt
lrwxrwxrwx 1 x86tux x86tux 12 Jun 16 23:40 symlink.txt -> realfile.txt
$ gzip symlink.txt
gzip: symlink.txt: Too many levels of symbolic links
$ gzip -f symlink.txt
$ ls -l
total 8
-rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt
-rw-rw-r-- 1 x86tux x86tux 45 Jun 16 13:10 symlink.txt.gz
$ gunzip symlink.txt.gz
$ ls -l
total 8
-rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt
-rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 symlink.txt
$ md5sum *
618f486e0225d305d16d0648ed44b1eb  realfile.txt
618f486e0225d305d16d0648ed44b1eb  symlink.txt
4
27.01.2020, 20:54

Отдельный процесс для каждой части файла мог бы повредить кому-то, если бы была какая-либо возможность узкого места вашей операции, но при 10-11 гигабайтах очень трудно представить любой сценарий, в котором это вызов exec для gzip , который препятствует прогрессу.

В том же ключе, если бы это была куча небольших файлов, тогда gzip , вероятно, не смог бы сжать их, имея меньше данных для сравнения на файл, но, опять же, на 10-11 гигабайт на операцию сжатия, что не будет проблемой.

Думаю, было бы интересно выяснить причину ошибки. Я бы посоветовал попытаться применить lsof к фоновому gzip pid и выяснить, что происходит.

1
27.01.2020, 20:54

Теги

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