Почему "ls" занимает очень много времени в маленьком каталоге, который раньше был большим? Как это исправить?

Одно из возможных решений (без установки GRUB в MBR):

  1. Создайте загрузочный USB-накопитель с Live Ubuntu.
  2. Загрузите Live Ubuntu.
  3. Смонтируйте root(/)раздел, содержащий вашу предыдущую установку Ubuntu на жестком диске.
  4. Откройте /etc/grub/grub.cfgи найдите нужный пункт меню menuentry {... }структуру (предыдущую установку на HDD ).
  5. Вставьте в /etc/grub/grub.d/40_customфайл Live Ubuntu вашу menuentryструктуру (предыдущий элемент ).
  6. Запустите sudo update-grubдля обновления изменений GBUR.
  7. Перезагрузка.

Теперь вы сможете увидеть новую запись в меню GRUB, содержащую вашу установку с жесткого диска. Просто выберите и загрузитесь. Надеюсь, поможет.


Восстановить GRUB

Если вы хотите восстановить GRUB и разрешить загрузку Windows, см. следующий ответ на портале Ask Ubuntu.

39
26.04.2021, 14:55
2 ответа

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

При создании нового каталога для записей каталога выделяется минимальное количество пробелов. По мере того, как добавляется все больше и больше файлов, выделяются новые блоки для хранения записей каталога по мере необходимости. Но когда файлы удаляются, файловая система ext4не объединяет записи каталога и не освобождает теперь -ненужные блоки метаданных каталога, поскольку предполагается, что они могут понадобиться снова достаточно скоро.

Возможно, вам придется размонтировать файловую систему и запустить на ней e2fsck -C0 -f -D /dev/sda9оптимизацию каталогов, освобождение дополнительных блоков метаданных каталога и консолидацию существующих записей каталога в меньшем пространстве.

Поскольку это ваша /homeфайловая система, вы можете сделать это, убедившись, что все учетные записи обычных пользователей вышли из системы, а затем локально войти в систему как пользователь root (, обычно через текстовую консоль ). Если umount /homeв этой ситуации сообщает, что файловая система занята, вы можете использовать fuser -m /dev/sda9для определения процессов, блокирующих размонтирование /home. Если это остатки старых пользовательских сеансов, вы, вероятно, можете просто их убить; но если они относятся к услугам,вы можете захотеть остановить эти службы контролируемым образом.

Другим классическим способом капитального обслуживания /homeтакого рода является загрузка системы в однопользовательском -/аварийном режиме. В дистрибутивах, использующих systemd, параметр загрузки systemd.unit=emergency.targetдолжен это делать.

И, как упоминали другие, есть еще более простое решение, если сохранение временных меток каталога не важно , и проблемный каталог не является корневым каталогом файловой системы, он находится в :создайте новый каталог рядом с «раздутым», переместите все файлы в новый каталог, удалите старый каталог и переименуйте новый каталог, чтобы он имел то же имя, что и старый. Например, если /directory/Aпроблема:

mkdir /directory/B
mv /directory/A/* /directory/B/      # regular files and sub-directories
mv /directory/A/.??* /directory/B/   # hidden files/dirs too
rmdir /directory/A
mv /directory/B /directory/A

Конечно, если каталог используется какими-либо службами, было бы неплохо сначала остановить эти службы.

62
28.04.2021, 22:51

Из любопытства попробуем воспроизвести вот это:

$ mkdir test
$ cd test
$ time ls   # Check initial speed of ls
real    0m0,002s
$ stat.    # Check initial size of directory
  File:.
  Size: 4096        Blocks: 8          IO Block: 4096   directory
 ...
$ seq 1 1000000 | xargs touch    # Create lot of files
$ echo 3 | sudo tee /proc/sys/vm/drop_caches   # Clear cache
$ time ls > /dev/null
real    0m1.588s
$ stat.                        # Check size of directory when files are there
  File:.
  Size: 22925312    Blocks: 44776      IO Block: 4096   directory

Итак, теперь у нас есть большой каталог. Давайте удалим файлы и посмотрим, что произойдет:

$ ls | xargs rm   # To avoid too long argument list
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
$ time ls > /dev/null
real    0m1.242s
$ stat.
 File:.
 Size: 22925312     Blocks: 44776      IO Block: 4096   directory

Так что да, выделенный размер для каталога остается большим, и это приводит к замедлению ls, как также указано в ответе telcoM.

Если проблема только в одном каталоге, есть более простое решение, не требующее размонтирования или root-доступа.:Просто создайте новый каталог, переместите в него оставшиеся файлы и удалите раздутый.

43
28.04.2021, 22:51

Теги

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