Место на диске linux: Как узнать доступное место на диске в Linux?
Свободное место на диске Linux
В Linux-е диск, даже если он один всегда разбит на несколько частей, каждая из которых служит для определенных целей. Linux устроен так, что на его дисках можно потратить абсолютно всё свободное место до нуля и он все-равно будет продолжать загружаться, работать и т.д.
Если вам нужно узнать сколько места занимает каждая из папок (сколько весит) в Linux, тогда вам в следующую статью: Чем занято место на диске Linux.
Чтобы проверять свободное место на диске в Linux-е есть несколько способов.
1-й способ. Определение свободного места в Linux через терминал
Терминал — неотъемлимая часть Linux-а, как cmd для Windows-а. Чтобы узнать занятое и свободное место в разделах через терминал, как правило используют команду df. Наиболее частый вариант ее использования такой:
df -h
Ключ -h означает human, т.е. «человеческий» формат вывода. При использовании такого флага, Вы увидите сколько всего есть места и сколько есть доступного свободного места в мегабайтах, гигабайтах и т.п. Результат будет выглядеть примерно так:
Filesystem Size Used Avail Use% Mounted on /dev/sdb1 60G 19G 41G 32% /
Т.е. наш диск имеет размер 60 Гб, использовано на нем 19 Гб, свободно 41 Гб.
Кроме ключа -h можно так же использовать такие ключи:
-k — вывести объем места в килобайтах,
-m — вывести объем места в мегабайтах.
Есть так же и другие ключи, изучить которые можно набрав команду man df.
Иногда, когда свободное место заканчивается, вы можете столкнуться с ситуацией, когда df неверно отображает свободное место. Однако, не пугайтесь, т.к. все дело в том, что если используется файловая система Ext4, то 5% (по умолчанию) резервируется для root. Поменять размер резервируемого места можно с помощью утилиты tune2fs, примерно так: tune2fs -r 0 /dev/sdb1 где 0 — количество резервируемых блоков. Размер блока обычно равен 1024 байтам.
Помимо определения свободного места на диске, команда df полезна для того, чтобы узнать на каком разделе находится папка (директория) или файл. Сделать это очень просто. Нужно всего-лишь дописать к команде путь до папки, т.е. написать, например, так:
$ df -h /usr/local/ Файловая система Разм Исп Дост Исп% смонтирована на /dev/sda3 70G 29G 38G 43% /
Или, например, так:
$ df -h ~/tmp Файловая система Разм Исп Дост Исп% смонтирована на /dev/sdb1 466G 452G 14G 97% /home
Размеры папок и дисков в Linux. Команды df и du. Linux статьи
Рассмотрим, как используя команды df и du просматривать свободное место на дисках и размеры папок в Linux.
Свободное место на диске (df)
Для просмотра свободного и занятого места на разделах диска в Linux можно воспользоваться командой df.
Первым делом можно просто ввести команду df без каких-либо аргументов и получить занятое и свободное место на дисках. Но по умолчанию вывод команды не очень наглядный — например, размеры выводятся в КБайтах (1К-блоках).
df
Файл.система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
udev 1969036 0 1969036 0% /dev
tmpfs 404584 6372 398212 2% /run
/dev/sda9 181668460 25176748 147240368 15% /
...
/dev/sda1 117194136 103725992 13468144 89% /media/yuriy/5EB893BEB893935F
/dev/sda6 144050356 121905172 14804772 90% /media/yuriy/2f24.......d9075
Примечание: df не отображает информацию о не смонтированных дисках.
Опция -h
Опция -h (или —human-readable) позволяет сделать вывод более наглядным. Размеры выводятся теперь в ГБайтах.
df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
udev 1,9G 0 1,9G 0% /dev
tmpfs 396M 6,3M 389M 2% /run
/dev/sda9 174G 25G 141G 15% /
...
/dev/sda1 112G 99G 13G 89% /media/yuriy/5EB893BEB893935F
/dev/sda6 138G 117G 15G 90% /media/yuriy/2f24.......d9075
Размер конкретного диска
Команде df можно указать путь до точки монтирования диска, размер которого вы хотите вывести:
df -h /dev/sda9
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/sda9 174G 25G 141G 15% /
Размер папок на диске (du)
Для просмотра размеров папок на диске используется команда du.
Если просто ввести команду без каких либо аргументов, то она рекурсивно проскандирует вашу текущую директорию и выведет размеры всех файлов в ней. Обычно для du указывают путь до папки, которую вы хотите проанализировать.
Если нужно просмотреть размеры без рекурсивного обхода всех папок, то используется опция -s (—summarize). Также как и с df, добавим опцию -h (—human-readable).
Размер конкретной папки:
du -sh ./Загрузки
3,4G ./Загрузки
Размеры файлов и папок внутри конкретной папки:
du -sh ./Загрузки/*
140K ./Загрузки/antergos-17.1-x86_64.iso.torrent
79M ./Загрузки/ubuntu-amd64.deb
49M ./Загрузки/data.zip
3,2G ./Загрузки/Parrot-full-3.5_amd64.iso
7,1M ./Загрузки/secret.tgz
Linux: свободное место на диске
Довольно часто может понадобиться узнать количество оставшегося свободного места на диске или разделе Linux. В графических окружениях рабочего стола, таких как GNOME и KDE есть соответствующие утилиты, однако, может потребоваться посмотреть свободное место из терминальной сессии. Для этого используется команда df, которая позволяет узнать количество занятого и свободного места, точки монтирования файловых систем, общий объем файловой системы, узнать количество доступных инодов.
Синтаксис команды df
Общий вид синтакса команды следующий:
df
df /путь/к/устройству
df [ключи]
df [ключи] /путь/к/устройству
Примеры использования
Для вывода общей информации о свободном месте в вашей системе Linux выполните команду df без ключей:
df
Пример вывода:
Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
devtmpfs 1995652 0 1995652 0% /dev
tmpfs 2006780 476 2006304 1% /dev/shm
tmpfs 2006780 3516 2003264 1% /run
/dev/sda6 413593648 302121692 90455944 77% /
tmpfs 2006780 0 2006780 0% /sys/fs/cgroup
tmpfs 2006780 0 2006780 0% /media
/dev/sda3 487652 91738 370314 20% /boot
Однако, такой вывод довольно сложно воспринять по причине того, что информация о размере файловых систем и использованного объема выводится в килобайтах вне зависимости от размера. Для того, чтобы вывести информацию о свободном месте на дисках в более удобном для чтения формате выполните команду df с ключом -h (вывод в удобном для восприятия формате, зависящем от размера, например: 1K 234M 2G) или -H (суть та же, но при этом для расчета размера используется множитель 1000, а не 1024, как в предыдущем случае). Выполните:
df -H
Пример вывода:
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
devtmpfs 2,1G 0 2,1G 0% /dev
tmpfs 2,1G 467k 2,1G 1% /dev/shm
tmpfs 2,1G 3,7M 2,1G 1% /run
/dev/sda6 424G 310G 93G 77% /
tmpfs 2,1G 0 2,1G 0% /sys/fs/cgroup
tmpfs 2,1G 0 2,1G 0% /media
/dev/sda3 500M 94M 380M 20% /boot
Для просмотра сведений о файловой системе (разделе), в которой находится файл или папка необходимо указать путь в качестве аргумента. Например, для просмотра информации о свободном месте на разделе, содержащем /home выполните одну из команд:
df /home
df -h /home
Пример вывода команды df -h /home:
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
/dev/sda6 395G 289G 87G 77% /
Для того, чтобы указать в выводе тип файловой системы запуcтите команду с ключом -T:
df -T -h
Пример вывода:
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
devtmpfs devtmpfs 2,0G 0 2,0G 0% /dev
tmpfs tmpfs 2,0G 456K 2,0G 1% /dev/shm
tmpfs tmpfs 2,0G 3,5M 2,0G 1% /run
/dev/sda6 ext4 395G 289G 87G 77% /
tmpfs tmpfs 2,0G 0 2,0G 0% /sys/fs/cgroup
tmpfs tmpfs 2,0G 0 2,0G 0% /media
/dev/sda3 ext4 477M 90M 362M 20% /boot
Для просмотра количества использованных инодов(индексных дескрипторов), используйте ключ -i. Примеры:
df -i
df -i /
df -ih /
df -i /dev/sda1
Пример вывода команды df -i /dev/sda3:
Файловая система Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
/dev/sda3 26271744 93619 25778125 2% /
Описание ключей команды df
Ключ | Описание |
-a или —all | Включить в вывод все (несуществующие) файловые системы |
-B или —block-size=SIZE | Пересчитать единицы измерения перед выводом, например, -BM означает вывести информацию в мегабайтах |
—total | Подсчитать общее |
-h или —human-readable | Вывести информацию в удобном для восприятия виде (например: 1K 234M 2G) |
-H или —si | Тоже самое, что и -h, но при пересчете используется множитель 1000, а не 1024 |
-i или —inodes | Вывести информацию об индексных дескрипторах (инодах), а не об использовании блоков |
-k | Аналог —block-size=1K |
-l или —local | Перечислить только локальные файловые системы |
—no-sync | Не вызывать sync перед получением информации об использовании блоков (используется по-умолчанию) |
-P или —portability | Выводить в формате POSIX |
—sync | Вызывать sync перед получением информации об использовании блоков |
-t или —type=ТИП | Перечислить только файловые системы указанного типа |
-T или —print-type | Печатать тип файловой системы |
-x или —exclude-type=ТИП | Исключить файловые системы указанного ТИПА |
узнать свободное место на диске
Иногда надо узнать под linux свободное место на диске. Делается это элементарно, но не очень часто, поэтому, всё время вылетает из головы.
Существует достаточно много утилит, которые могут это сделать, но, Linux (будь то Ubuntu, CentOS, Fedora, Mint или какой другой дистрибутив) имеет встроенную команду для этого. Чтобы узнать сколько свободного места на диске, открываем терминал и пишем:
$ df
Файл.система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/mapper/ubuntu-root 110375776 66075720 38693248 64% /
udev 4066960 12 4066948 1% /dev
tmpfs 1631920 988 1630932 1% /run
none 5120 0 5120 0% /run/lock
none 4079792 1184 4078608 1% /run/shm
none 102400 32 102368 1% /run/user
/dev/sda1 233191 67028 153722 31% /boot
/home/lizzard/.Private 110375776 66075720 38693248 64% /home/lizzard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $ df
Файл.система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/mapper/ubuntu-root 110375776 66075720 38693248 64% /
udev 4066960 12 4066948 1% /dev
tmpfs 1631920 988 1630932 1% /run
none 5120 0 5120 0% /run/lock
none 4079792 1184 4078608 1% /run/shm
none 102400 32 102368 1% /run/user
/dev/sda1 233191 67028 153722 31% /boot
/home/lizzard/.Private 110375776 66075720 38693248 64% /home/lizzard |
Вывод может несколько отличаться, в зависимости от структуры вашей файловой системы и примонтированных устройств.
В целом, это выглядит не очень читаемо. Однако, ситуацию можно легко улучшить, есть два пути:
1. Берём калькулятор и считаем: в одном килобайте 1024 байт, в одном мегабайте 1024 килобайт! Если кто ещё не понял, это была шутка.
2. Второй способ для «настоящих героев», которые всегда идут в обход. Добавляем всего один флаг — «-h», который как бы говорит нам «помогите, я ничего не понимаю в этих цифрах!!!» (на самом деле, он значит «human readable», но, уверяю вас, смысл именно такой):
$ df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/mapper/ubuntu-root 106G 64G 37G 64% /
udev 3,9G 12K 3,9G 1% /dev
tmpfs 1,6G 988K 1,6G 1% /run
none 5,0M 0 5,0M 0% /run/lock
none 3,9G 1,2M 3,9G 1% /run/shm
none 100M 32K 100M 1% /run/user
/dev/sda1 228M 66M 151M 31% /boot
/home/lizzard/.Private 106G 64G 37G 64% /home/lizzard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $ df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/mapper/ubuntu-root 106G 64G 37G 64% /
udev 3,9G 12K 3,9G 1% /dev
tmpfs 1,6G 988K 1,6G 1% /run
none 5,0M 0 5,0M 0% /run/lock
none 3,9G 1,2M 3,9G 1% /run/shm
none 100M 32K 100M 1% /run/user
/dev/sda1 228M 66M 151M 31% /boot
/home/lizzard/.Private 106G 64G 37G 64% /home/lizzard |
Теперь мы знаем как под linux узнать свободное место. Домашнее задание: добиться просветления и понять почему утилита для этого называется df. Потому что он связана с дисками и файловой системой? Свои догадки пишите в комментарии.
Поиск больших файлов Linux | Losst
Если на вашем жёстком диске закончилось свободное пространство, самый простой способ его освободить — найти и удалить самые большие и при этом ненужные файлы. Такая задача может возникнуть как на сервере, так и на домашнем компьютере, поэтому существуют удобные решения для обоих ситуаций. Способов поиска больших файлов существует очень много.
Как вы уже поняли, в этой небольшой инструкции мы рассмотрим, как найти большие файлы Linux с помощью графического интерфейса или консольных утилит. Будем двигаться от самого простого к более сложному.
Содержание статьи:
Поиск больших файлов Linux
1. GDMap
Несмотря на то, что графических утилит есть около десятка, все они мне не очень нравятся. Например в Gnome можно использовать GDMap, а в KDE — fileslight. Обе утилиты сканируют файловую систему и выводят все файлы в виде диаграммы. Размер блока зависит от размера файла. Чем больше файл или папка, тем больше блок. Для установки GDMap в Ubuntu выполните:
sudo apt install gdmap
Затем запустите утилиту из главного меню. По умолчанию она отображает домашнюю папку. Здесь можно оценить, какие файлы самые увесистые.
2. Утилита ncdu
Это псевдографическая утилита, которая работает в терминале Linux. Она отображает список файлов и директорий по объёму и, что самое интересное, тут же позволяет удалять ненужные файлы. Для установки утилиты выполните:
sudo apt install ncdu
Затем запустите утилиту, передав ей в качестве параметра папку, которую надо просканировать. Можно проверить ту же домашнюю папку:
ncdu /home
У утилиты очень простое управление. Для перемещения по списку используйте кнопки со стрелками вверх и вниз, для открытия папки — клавишу Enter, а для удаления файла — кнопку d. Также можно использовать для перемещения кнопки в Vim стиле — h, j, k, l.
3. Утилита du
Если у вас нет возможности устанавливать новые утилиты, может помочь установленная по умолчанию во всех дистрибутивах утилита du. С помощью следующей команды вы можете вывести 20 самых больших файлов и папок в нужной папке, для примера снова возьмём домашнюю папку:
sudo du -a /home/ | sort -n -r | head -n 20
Мы не можем использовать опцию -h для вывода размера в читабельном формате, потому что тогда не будет работать сортировка.
4. Утилита find
С помощью команды find вы тоже можете искать большие файлы Linux. Для этого используйте опцию -size. Например, давайте найдём файлы, которые больше 500 мегабайтов в той же домашней папке:
sudo find /home -xdev -type f -size +500M
Можно пойти ещё дальше — вывести размер этих файлов и отсортировать их по размеру:
find / -xdev -type f -size +100M -exec du -sh {} ';' | sort -rh
Самые большие файлы Linux будут сверху, а более мелкие — ниже.
Выводы
В этой небольшой статье мы разобрались, как выполняется поиск больших файлов Linux. После того, как вы их нашли, остаётся выбрать ненужные и удалить, если подобное происходит на сервере, то, обычно, это логи различных сервисов или кэш. Обратите внимание, что после удаления файлов место в файловой системе может и не освободится. Для полного освобождения места следует перезагрузить компьютер. Это довольно частая проблема на серверах и VPS.
Понимая, как используется дисковое пространство в Linux / Блог компании Флант / Хабр
Прим перев.: Автор оригинальной статьи — испанский Open Source-энтузиаст nachoparker, развивающий проект NextCloudPlus (ранее известен как NextCloudPi), — делится своими знаниями об устройстве дисковой подсистемы в Linux, делая важные уточнения в ответах на простые, казалось бы, вопросы…
Сколько пространства занимает этот файл на жёстком диске? Сколько свободного места у меня есть? Сколько ещё файлов я смогу вместить в оставшееся пространство?
Ответы на эти вопросы кажутся очевидными. У всех нас есть инстинктивное понимание работы файловых систем и зачастую мы представляем хранение файлов на диске аналогично заполнению корзины яблоками.
Однако в современных Linux-системах такая интуиция может вводить в заблуждение. Давайте разберёмся, почему.
Размер файла
Что такое размер файла? Ответ вроде бы прост: совокупность всех байтов его содержимого, от начала до конца файла.
Зачастую всё содержимое файла представляется как расположенное байт за байтом:
Так же мы воспринимаем и понятие размер файла. Чтобы его узнать, выполняем ls -l file.c
или команду stat
(т.е. stat file.c
), которая делает системный вызов stat()
.
В ядре Linux структурой памяти, представляющей файл, является inode. И метаданные, к которым мы обращаемся с помощью команды stat
, находятся именно в inode.
Фрагмент include/linux/fs.h
:
struct inode {
/* excluded content */
loff_t i_size; /* file size */
struct timespec i_atime; /* access time */
struct timespec i_mtime; /* modification time */
struct timespec i_ctime; /* change time */
unsigned short i_bytes; /* bytes used (for quota) */
unsigned int i_blkbits; /* block size = 1 << i_blkbits */
blkcnt_t i_blocks; /* number of blocks used */
/* excluded content */
}
Здесь можно увидеть знакомые атрибуты, такие как время доступа и модификации, а также i_size
— это и есть размер файла, как он был определён выше.
Размышлять в терминах размера файла интуитивно понятно, но больше нас интересует, как в действительности используется пространство.
Блоки и размер блока
Для внутреннего хранения файла файловая система разбивает хранилище на блоки. Традиционным размером блока были 512 байт, но более актуальное значение — 4 килобайта. Вообще же при выборе этого значения руководствуются поддерживаемым размером страницы на типовом оборудовании MMU (memory management unit, «устройство управления памятью» — прим. перев.).
Файловая система вставляет порезанный на части (chunks) файл в эти блоки и следит за ними в метаданных. В идеале всё выглядит так:
… но в действительности файлы постоянно создаются, изменяются в размере, удаляются, поэтому реальная картина такова:
Это называется внешней фрагментацией (external fragmentation) и обычно приводит к падению производительности. Причина — вращающейся головке жёсткого диска приходится переходить с места на место, чтобы собрать все фрагменты, а это медленная операция. Решением данной проблемы занимаются классические инструменты дефрагментации.
Что происходит с файлами меньше 4 КБ? Что происходит с содержимым последнего блока после того, как файл был порезан на части? Естественным образом будет возникать неиспользуемое пространство — это называется внутренней фрагментацией (internal fragmentation). Очевидно, этот побочный эффект нежелателен и может привести к тому, что многое свободное пространство не будет использоваться, особенно если у нас большое количество очень маленьких файлов.
Итак, реальное использование диска файлом можно увидеть с помощью stat
, ls -ls file.c
или du file.c
. Например, содержимое 1-байтового файла всё равно занимает 4 КБ дискового пространства:
$ echo "" > file.c
$ ls -l file.c
-rw-r--r-- 1 nacho nacho 1 Apr 30 20:42 file.c
$ ls -ls file.c
4 -rw-r--r-- 1 nacho nacho 1 Apr 30 20:42 file.c
$ du file.c
4 file.c
$ dutree file.c
[ file.c 1 B ]
$ dutree -u file.c
[ file.c 4.00 KiB ]
$ stat file.c
File: file.c
Size: 1 Blocks: 8 IO Block: 4096 regular file
Device: 2fh/47d Inode: 2185244 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ nacho) Gid: ( 1000/ nacho)
Access: 2018-04-30 20:41:58.002124411 +0200
Modify: 2018-04-30 20:42:24.835458383 +0200
Change: 2018-04-30 20:42:24.835458383 +0200
Birth: -
Таким образом, мы смотрим на две величины: размер файла и использованные блоки. Мы привыкли думать в терминах первого, однако должны — в терминах последнего.
Специфичные для файловой системы возможности
Помимо актуального содержимого файла ядру также необходимо хранить все виды метаданных. Метаданные inode’а мы уже видели, но есть и другие данные, с которыми знаком каждый пользователь UNIX: права доступа, владелец, uid, gid, флаги, ACL.
struct inode {
/* excluded content */
struct fown_struct f_owner;
umode_t i_mode;
unsigned short i_opflags;
kuid_t i_uid;
kgid_t i_gid;
unsigned int i_flags;
/* excluded content */
}
Наконец, существуют ещё и другие структуры — вроде суперблока (superblock) с представлением самой файловой системы, vfsmount с представлением точки монтирования, а также информация об избыточности, именные пространства и т.п. Как мы увидим далее, некоторые из этих метаданных также могут занимать значительное место.
Метаданные размещения блоков
Эти данные сильно зависят от используемой файловой системы — в каждой из них по-своему реализовано сопоставление блоков с файлами. Традиционный подход ext2 — таблица i_block
с прямыми и непрямыми блоками (direct/indirect blocks).
Эту же таблицу можно увидеть в структуре памяти (фрагмент из fs/ext2/ext2.h
):
/*
* Structure of an inode on the disk
*/
struct ext2_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Creation time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks; /* Blocks count */
__le32 i_flags; /* File flags */
/* excluded content */
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
/* excluded content */
}
Для больших файлов такая схема приводит к большим накладным расходам, поскольку единственный (большой) файл требует сопоставления тысяч блоков. Кроме того, есть ограничение на размер файла: используя такой метод, 32-битная файловая система ext3 поддерживает файлы не более 8 ТБ. Разработчики ext3 спасали ситуацию поддержкой 48 бит и добавлением extents:
struct ext3_extent {
__le32 ee_block; /* first logical block extent covers */
__le16 ee_len; /* number of blocks covered by extent */
__le16 ee_start_hi; /* high 16 bits of physical block */
__le32 ee_start; /* low 32 bits of physical block */
};
Идея по-настоящему проста: занимать соседние блоки на диске и просто объявлять, где extent начинается и каков его размер. Таким образом мы можем выделять файлу большие группы блоков, минимизируя количество метаданных и заодно используя более быстрый последовательный доступ.
Примечание для любопытных: у ext4 предусмотрена обратная совместимость, то есть в ней поддерживаются оба метода: непрямой (indirect) и extents. Увидеть, как распределено пространство, можно на примере операции записи. Запись не идёт напрямую в хранилище — из соображений производительности данные сначала попадают в файловый кэш. После этого в определённый момент кэш записывает информацию на постоянное хранилище.
Кэш файловой системы представлен структурой address_space
, в которой вызывается операция writepages. Вся последовательность выглядит так:
(cache writeback) ext4_aops-> ext4_writepages() -> ... -> ext4_map_blocks()
… где ext4_map_blocks()
вызовет функцию ext4_ext_map_blocks()
или ext4_ind_map_blocks()
в зависимости от того, используются ли extents. Если взглянуть на первую в extents.c
, можно увидеть упоминания дыр (holes), о которых будет рассказано ниже.
Контрольные суммы
Файловые системы последнего поколения хранят также контрольные суммы (checksums) для блоков данных во избежание незаметного повреждения данных. Эта возможность позволяет обнаруживать и корректировать случайные ошибки и, конечно, ведёт к дополнительным накладным расходам в использовании диска пропорционально размеру файлов.
Более современные системы вроде BTRFS и ZFS поддерживают контрольные суммы для данных, а у более старых, таких как ext4, реализованы контрольные суммы для метаданных.
Журналирование
Возможности журналирования для ext2 появились в ext3. Журнал — циклический лог, записывающий обрабатываемые транзакции с целью улучшить устойчивость к сбоям питания. По умолчанию он применяется только к метаданным, однако можно его активировать и для данных с помощью опции data=journal
, что повлияет на производительность.
Это специальный скрытый файл, обычно с номером inode 8 и размером 128 МБ, объяснение про который можно найти в официальной документации:
Журнал, представленный в файловой системе ext3, используется в ext4 для защиты ФС от повреждений в случае системных сбоев. Небольшой последовательный фрагмент диска (по умолчанию это 128 МБ) зарезервирован внутри ФС как место для сбрасывания «важных» операций записи на диск настолько быстро, насколько это возможно. Когда транзакция с важными данными полностью записана на диск и сброшена с кэша (disk write cache), запись о данных также записывается в журнал. Позже код журнала запишет транзакции в их конечные позиции на диске (операция может приводить к продолжительному поиску или большому числу операций чтения-удаления-стирания) перед тем, как запись об этих данных будет стёрта. В случае системного сбоя во время второй медленной операции записи журнал позволяет воспроизвести все операции вплоть до последней записи, гарантируя атомарность всего, что пишется на диск через журнал. Результатом является гарантия, что файловая система не застрянет на полпути обновления метаданных.
«Упаковка хвостов»
Возможность tail packing, ещё называемая блочным перераспределением (block suballocation), позволяет файловым системам использовать пустое пространство в конце последнего блока («хвосты») и распределять его среди различных файлов, эффективно упаковывая «хвосты» в единый блок.
Замечательно иметь такую возможность, что позволяет сохранить много пространства, особенно если у вас большое количество маленьких файлов… Однако она приводит к тому, что существующие инструменты неточно сообщают об используемом пространстве. Потому что с ней мы не можем просто добавить все занятые блоки всех файлов для получения реальных данных по использованию диска. Эту фичу поддерживают файловые системы BTRFS и ReiserFS.
Разрежённые файлы
Большинство современных файловых систем поддерживают разрежённые файлы (sparse files). У таких файлов могут быть дыры, которые в действительности не записаны на диск (не занимают дисковое пространство). На этот раз реальный размер файла будет больше, чем используемые блоки.
Такая особенность может оказаться очень полезной, например, для быстрой генерации больших файлов или для предоставления свободного пространства виртуальному жёсткому диску виртуальной машины по запросу.
Чтобы медленно создать 10-гигабайтный файл, который занимает около 10 ГБ дискового пространства, можно выполнить:
$ dd if=/dev/zero of=file bs=2M count=5120
Чтобы создать такой же большой файл мгновенно, достаточно лишь записать последний байт… или даже сделать:
$ dd of=file-sparse bs=2M seek=5120 count=0
Или же воспользоваться командой truncate
:
$ truncate -s 10G
Дисковое пространство, выделенное файлу, можно изменить командой fallocate
, которая делает системный вызов fallocate()
. С этим вызовом доступны и более продвинутые операции — например:
- Предварительно выделить пространство для файла вставкой нулей. Такая операция увеличивает и использование дискового пространства, и размер файла.
- Освободить пространство. Операция создаст дыру в файле, делая его разрежённым и уменьшая использование пространства без влияния на размер файла.
- Оптимизировать пространство, уменьшив размер файла и использование диска.
- Увеличить пространство файла, вставив дыру в его конец. Размер файла увеличивается, а использование диска не меняется.
- Обнулить дыры. Дыры станут не записанными на диск extents, которые будут читаться как нули, не влияя на дисковое пространство и его использование.
Например, создать дыры в файле, превратив его в разрежённый, можно так:
$ fallocate -d file
Команда cp
поддерживает работу с разрежёнными файлами. С помощью простой эвристики она пытается определить, является ли исходный файл разрежённым: если это так, то результирующий файл тоже будет разрежённым. Скопировать же неразрежённый файл в разрежённый можно так:
$ cp --sparse=always file file_sparse
… а обратное действие (сделать «плотную» копию разрежённого файла) выглядит так:
$ cp --sparse=never file_sparse file
Таким образом, если вам нравится работать с разрежёнными файлами, можете добавить следующий алиас в окружение своего терминала (~/.zshrc
или ~/.bashrc
):
alias cp='cp --sparse=always'
Когда процессы читают байты в секциях дыр файловая система предоставляет им страницы с нулями. Например, можно посмотреть, что происходит, когда файловый кэш читает из файловой системы в области дыр в ext4. В этом случае последовательность в readpage.c
будет выглядеть примерно так:
(cache read miss) ext4_aops-> ext4_readpages() -> ... -> zero_user_segment()
После этого сегмент памяти, к которому процесс пытается обратиться с помощью системного вызова read()
, получит нули напрямую из быстрой памяти.
Файловые системы COW (copy-on-write)
Следующее (после семейства ext) поколение файловых систем принесло очень интересные возможности. Пожалуй, наибольшего внимания среди фич файловых систем вроде ZFS и BTRFS заслуживает их COW (copy-on-write, «копирование при записи»).
Когда мы выполняем операцию copy-on-write или клонирования, или копии reflink, или поверхностной (shallow) копии, на самом деле никакого дублирования extent’ов не происходит. Просто создаётся аннотация в метаданных для нового файла, которая отсылает к тем же самым extents оригинального файла, а сам extent помечается как разделяемый (shared). При этом в пользовательском пространстве создаётся иллюзия, что существуют два отдельных файла, которые можно отдельно модифицировать. Когда какой-то процесс захочет написать в разделяемый extent, ядро сначала создаст его копию и аннотацию, что этот extent принадлежит единственному файлу (по крайней мере, на данный момент). После этого у двух файлов появляется больше отличий, однако они все ещё могут разделять многие extents. Другими словами, extents в файловых системах с поддержкой COW можно делить между файлами, а ФС обеспечит создание новых extents только в случае необходимости.
Как видно, клонирование — очень быстрая операция, не требующая удваивания пространства, которое используется в случае обычной копии. Именно эта технология и стоит за возможностью создания мгновенных снапшотов в BTRFS и ZFS. Вы можете буквально клонировать (или сделать снапшот) всей корневой файловой системы меньше чем за секунду. Очень полезно, например, перед обновлением пакетов на случай, если что-то сломается.
BTRFS поддерживает два метода создания shallow-копий. Первый относится к подтомам (subvolumes) и использует команду btrfs subvolume snapshot
. Второй — к отдельным файлам и использует cp --reflink
. Такой алиас (опять же, для ~/.zshrc
или ~/.bashrc
) может пригодиться, если вы хотите по умолчанию делать быстрые shallow-копии:
cp='cp --reflink=auto --sparse=always'
Следующий шаг — если есть не-shallow-копии или файл, или даже файлы, с дублирующимися extents, можно дедуплицировать их, чтобы они использовали (через reflink) общие extents и освободили пространство. Один из инструментов для этого — duperemove, однако учтите, что это естественным образом приводит к более высокой фрагментации файлов.
Если мы попытаемся теперь разобраться, как дисковое пространство используется файлами, всё будет не так просто. Утилиты вроде du
или dutree всего лишь считают используемые блоки, не учитывая, что некоторые из них могут быть разделяемыми, поэтому они покажут больше занятого места, чем на самом деле используется.
Аналогичным образом, в случае BTRFS стоит избегать команды df
, поскольку пространство, занятое файловой системой BTRFS, она покажет как свободное. Лучше пользоваться btrfs filesystem usage
:
$ sudo btrfs filesystem usage /media/disk1
Overall:
Device size: 2.64TiB
Device allocated: 1.34TiB
Device unallocated: 1.29TiB
Device missing: 0.00B
Used: 1.27TiB
Free (estimated): 1.36TiB (min: 731.10GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Data,single: Size:1.33TiB, Used:1.26TiB
/dev/sdb2 1.33TiB
Metadata,DUP: Size:6.00GiB, Used:3.48GiB
/dev/sdb2 12.00GiB
System,DUP: Size:8.00MiB, Used:192.00KiB
/dev/sdb2 16.00MiB
Unallocated:
/dev/sdb2 1.29TiB
$ sudo btrfs filesystem usage /media/disk1
Overall:
Device size: 2.64TiB
Device allocated: 1.34TiB
Device unallocated: 1.29TiB
Device missing: 0.00B
Used: 1.27TiB
Free (estimated): 1.36TiB (min: 731.10GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Data,single: Size:1.33TiB, Used:1.26TiB
/dev/sdb2 1.33TiB
Metadata,DUP: Size:6.00GiB, Used:3.48GiB
/dev/sdb2 12.00GiB
System,DUP: Size:8.00MiB, Used:192.00KiB
/dev/sdb2 16.00MiB
Unallocated:
/dev/sdb2 1.29TiB
К сожалению, я не знаю простых способов отслеживания занятого пространства отдельными файлами в файловых системах с COW. На уровне подтома с помощью утилит вроде btrfs-du мы можем получить приблизительное представление о количестве данных, которые уникальны для снапшота и которые разделяются между снапшотами.
Ссылки
P.S. от переводчика
Читайте также в нашем блоге:
Как узнать размер папки в Linux
Зная о системе максимум информации, пользователь сможет легче определять все нюансы в ее работе. Немаловажным является знание сведений о размере папок в Linux, но для начала нужно определиться, каким способом для получения этих данных пользоваться.
Читайте также: Как узнать версию дистрибутива Linux
Способы определения размера папки
Пользователи операционных систем на базе Linux знают, что большинство действий в них решаются несколькими способами. Так и в случае с определением размера папки. Такая, на первый взгляд, тривиальная задача может ввести в ступор «новичка», но инструкция, которая будет приведена ниже, поможет во всем детально разобраться.
Способ 1: Терминал
Чтобы получить подробнейшую информацию о размере папок в Linux, лучше воспользоваться командой du в «Терминале». Хотя данный способ может отпугнуть неопытного пользователя, который только перешел на Linux, он отлично подойдет для выяснения нужной информации.
Синтаксис
Вся структура утилиты du выглядит следующим образом:
du
du название_папки
du [опция] название_папки
Читайте также: Часто используемые команды в «Терминале»
Как видно, синтаксис у нее может строиться по-разному. Например, при выполнении команды du (без указания папки и опции) вы получите стену текста с перечислением размеров всех папок в текущей директории, что крайне неудобно для восприятия.
Лучше использовать опции, если вы хотите получить структурированные данные, подробнее о чем будет рассказано ниже.
Опции
Перед демонстрацией наглядных примеров команды du стоит перечислить ее опции, чтобы использовать все возможности при сборе информации о размере папок.
- -а — вывести на экран сведения о суммарном размере файлов, помещенных в каталог (в конце списка указывается суммарный объем всех файлов в папке).
- —apparent-size — показать достоверный объем помещенных внутрь каталогов файлов. Параметры некоторых файлов в папке иногда бывают недействительными, на это влияет множество факторов, так что использование этой опции помогает удостовериться в корректности данных.
- -B, —block-size=РАЗМЕР — перевести полученные результаты в килобайты (K), мегабайты (M), гигабайты (G), терабайты (T). Например, команда с опцией -BM выведет размер папок в мегабайтах. Обратите внимание, что при использовании различных величин их значение имеет погрешность, ввиду округления до меньшего целого числа.
- -b — отображать данные в байтах (равнозначно —apparent-size и —block-size=1).
- -с — показывать общий итог подсчета размера папки.
- -D — приказ проследовать лишь по тем ссылкам, которые указаны в консоли.
- —files0-from=ФАЙЛ — показать отчет по использованию диска, чье имя будет введено вами в графу «ФАЙЛ».
- -H — равнозначен ключу -D.
- -h — перевести все значения в понятный для человека формат, используя соответствующие единицы измерения данных (килобайты, мегабайты, гигабайты и терабайты).
- —si — практически равносильна прошлой опции, за исключением того, что использует делитель, равный одной тысяче.
- -k — отображать данные в килобайтах (то же самое, что и команда —block-size=1000).
- -l — приказ приплюсовывать все данные в том случае, когда есть боле одной сноски на один и тот же объект.
- -m — отображать данные в мегабайтах (аналогично команде —block-size-1000000).
- -L — строго следовать указанным символьным ссылкам.
- -P — аннулирует предыдущую опцию.
- -0 — каждую выводимую строчку информации заканчивать нулевым байтом, а не начинать новую строку.
- -S — при подсчете занятого пространства не учитывать размер самих папок.
- -s — показывать размер лишь той папки, которую вы указали в качестве аргумента.
- -x — не выходить за пределы указанной файловой системы.
- —exclude=ОБРАЗЕЦ — игнорировать все файлы, совпадающие с «Образцом».
- -d — задать глубину следования папкам.
- —time — показать сведения о последних изменениях в файлах.
- —version — уточнить версию утилиты du.
Теперь, зная все опции команды du, вы сможете самостоятельно применять их на практике, осуществляя гибкую настройку сбора информации.
Примеры использования
Напоследок, чтобы закрепить полученную информацию, стоит рассмотреть несколько примеров использования команды du.
Без ввода дополнительных опций утилита будет автоматически выводить имена и размер папок, расположенных по указанному пути, попутно выводя также и подпапки.
Пример:
du
Для вывода данных об интересующей вас папке введите ее имя в контекст команды. К примеру:
du /home/user/Загрузки
du /home/user/Изображения
Чтобы было проще воспринимать всю выводимую информацию, воспользуйтесь опцией -h. Она подстроит размер всех папок под общепринятые единицы измерения цифровых данных.
Пример:
du -h /home/user/Загрузки
du -h /home/user/Изображения
Для полного отчета об объеме, занимаемом определенной папкой, укажите вместе с командой du опцию -s, а после — имя интересующей вас папки.
Пример:
du -s /home/user/Загрузки
du -s /home/user/Изображения
Но удобнее будет задействовать опции -h и -s вместе.
Пример:
du -hs /home/user/Загрузки
du -hs /home/user/Изображения
Опция -с применяется для вывода общей суммы, занимаемого папками места (ее можно применить вместе с опциями -h и -s).
Пример:
du -chs /home/user/Загрузки
du -chs /home/user/Изображения
Еще одна крайне полезная «фишка», о которой не было сказано выше, — это опция —-max-depth. С помощью нее вы сможете задать глубину, с которой утилита du будет следовать папкам. Например, при указанном коэффициенте глубины в одну единицу, будут просмотрены данные о размере всех без исключения папок, указанных в данном отрезке, а папки в них будут проигнорированы.
Пример:
du -h --max-depth=1
Выше были приведены самые популярные применения утилиты du. Используя их, вы сможете добиться желаемого результата — узнать размер папки. Если же опций, используемых в примерах, вам покажется мало, то можете самостоятельно разобраться с остальными, применяя их на практике.
Способ 2: Файловый менеджер
Безусловно, «Терминал» способен предоставить просто кладезь информации о размере папок, но рядовому пользователю будет сложно в нем разобраться. Куда привычней наблюдать графический интерфейс, нежели набор символов на темном фоне. В этом случае, если нужно узнать лишь размер одной папки, лучшим вариантом будет воспользоваться файловым менеджером, который установлен в Linux по умолчанию.
Примечание: в статье будет использован файловый менеджер Nautilus, который является стандартным для Ubuntu, однако инструкция будет применима и к другим менеджерам, отличаться может лишь расположение некоторых элементов интерфейса и их отображение.
Чтобы узнать размер папки в Linux с помощью файлового менеджера, выполните следующие действия:
- Откройте менеджер файлов, нажав по иконке на панели задач или проведя поиск по системе.
- Перейдите в директорию, где находится нужная папка.
- Нажмите правой кнопкой мыши (ПКМ) по папке.
- Из контекстного меню выберите пункт «Свойства».
После проделанных манипуляций перед вами появится окно, в котором нужно отыскать строку «Содержание» (1), напротив нее и будет указан размер папки. Кстати, чуть ниже будет находиться информация об оставшемся свободном месте на диске (2).
Заключение
По итогу вы имеете два способа, с помощью которых можно узнать размер папки в операционных системах на базе Linux. Хоть они и предоставляют одну и туже информацию, варианты ее получения кардинально отличаются. Если вам надо быстро узнать размер одной папки, то идеальным решением будет использование файлового менеджера, а если вам нужно получить как можно больше информации, то отлично подойдет «Терминал» с утилитой du и ее опциями.
Мы рады, что смогли помочь Вам в решении проблемы.
Опишите, что у вас не получилось.
Наши специалисты постараются ответить максимально быстро.
Помогла ли вам эта статья?
ДА НЕТ
тестирование свободного места на диске в linux
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.
Дисковое пространство Linux: как визуализировать свое использование
В наши дни дисковое пространство дешево, но не настолько дешево, чтобы можно было безрассудно относиться к хранилищу. Даже с учетом того, что терабайтные диски становятся нормой, просто удивительно, насколько быстро все это пространство может заполняться — а когда они заполняются и , восстановление этого пространства может оказаться головной болью.
Что, если бы вы могли сразу увидеть использование всего дискового пространства?
Мы уже рассматривали визуализаторы дискового пространства в Windows, но многие из них недоступны в Linux.И хотя большинство дистрибутивов Linux поставляются со встроенными командами для изучения использования диска, они, как правило, слишком сложны для таких неопытных пользователей Linux, как я.
Я предпочитаю что-то прямое и интуитивно понятное.Вот некоторые из лучших, что я нашел.
Не позволяйте командной строке этой программы вас отпугнуть.Обещаю, это намного проще, чем может показаться на первый взгляд. Инструмент ncdu , который расшифровывается как NCurses Disk Usage, построен на библиотеке ncurses, которая позволяет создавать графические интерфейсы внутри терминала.
На самом деле, я считаю ncdu самым простым инструментом из всех в этом списке.Когда вы запускаете его, он немедленно сканирует вашу систему и запускает вас в каталоге, указанном в качестве параметра (по умолчанию это домашний каталог). Оттуда вы просто перемещаетесь с помощью клавиш курсора.
С помощью одного нажатия клавиши можно выполнить несколько действий, например сортировку по имени или размеру, удаление данного файла или каталога, переключение скрытых файлов, отображение дополнительной информации об элементе и т. Д.
В целом, это замечательный инструмент, который позволяет многое, оставаясь при этом чистым и минималистичным.
Анализатор использования диска
Вы можете узнать эту программу по прежнему названию — Баобаб.Некоторое время назад GNOME начал переименовывать свои предложения программного обеспечения по умолчанию (например, когда Totem был переименован в GNOME Videos), в результате чего получилось новое имя Disk Usage Analyzer .
В любом случае, те же функции, которые сделали Baobab таким полезным, все еще здесь, что делает Disk Usage Analyzer одним из лучших графических инструментов для пользователей GNOME.
Что мне нравится в этом, так это его функциональная простота.Окно разделено на две панели: левая сторона показывает древовидную структуру, которая начинается в корне, а правая сторона показывает круговую, но не совсем круговую диаграмму, которая кодирует каждый элемент цветом для облегчения различения.
Как следует из названия, это всего лишь анализатор, поэтому вам нечего делать с точки зрения взаимодействия с файлами и каталогами, когда вы просматриваете свои жесткие диски.Однако, если все, что вам нужно, это быстрый способ точно определить использование данных, это очень хорошо.
K4DirStat
Если вы пользователь Windows, возможно, вы знакомы с WinDirStat.Знаете ли вы, что WinDirStat на самом деле является клоном инструмента KDE под названием KDirStat? Большинство людей думают, что Linux скопировал здесь Windows, но все наоборот. Хотя это не имеет особого значения.
K4DirStat — последняя версия, построенная на основе среды рабочего стола KDE4.
Как и следовало ожидать от ситуации клонирования, K4DirStat выглядит почти идентично WinDirStat: древовидная иерархия, которая предоставляет много предварительной информации и графическую карту внизу, которая разделяет и группирует все файлы в соответствии с каталогом.
Больше нечего сказать.Есть причина, по которой K4DirStat и WinDirStat так популярны: они быстро обучаются, просты в использовании и чрезвычайно полезны для управления дисковым пространством. Если бы я не был пользователем GNOME, я бы наверняка использовал его в качестве основного инструмента анализа.
Графическая карта диска, более известная как GDMap , похожа на K4DirStat без аспекта иерархии дерева.Большинство людей считают отсутствие дерева необычным и неудобным, но если вы в меньшинстве и предпочитаете карту, то эта карта для вас.
По отображению прямоугольников пропорционального размера для представления различных файлов и каталогов можно очень быстро перемещаться, как только вы освоитесь.Это позволяет вам даже не беспокоиться об именах файлов или каталогов — самые большие фигуры занимают больше всего места.
Вот и все с точки зрения функций.GDMap легкий и простой — может быть, даже слишком простой — и это приложение, которое делает только одно, но делает это очень хорошо.
Последнее соображение в этом списке — кроссплатформенный инструмент на основе Java, который был рекомендован некоторыми нашими читателями, когда мы в последний раз рассматривали визуализацию дискового пространства.Если вам не нравится Java, будьте добры к себе и просто пропустите этот раздел.
JDiskReport — это обычный анализатор, который позволяет легко увидеть, какие файлы и каталоги являются наиболее серьезными виновниками нехватки места на диске.В этом смысле он на самом деле не намного больше, чем предыдущие инструменты, которые уже упоминались.
Однако то, что является отличным от в JDiskReport, заключается в том, что он предлагает несколько различных способов просмотра одной и той же информации.По умолчанию он отображает использование дискового пространства в виде круговой диаграммы, но вы также можете просмотреть список самых больших файлов Top 50 , а также распределения в соответствии с размером файла и типом файла.
Единственное, что мешает мне по-настоящему полюбить JDiskReport, — это его интерфейс.Написанный с использованием, как я полагаю, пользовательского интерфейса Java Swing, он кажется излишне устаревшим. Влияет ли это на функциональность? Нет. Это заставляет меня гримасничать? Немного.
Последние мысли
В конце концов, все, что работает, работает.Я не решаюсь назвать один из них лучше других, потому что все они соответствуют разным предпочтениям. Используйте тот, который лучше всего соответствует вашим вкусам; в любом случае они все сделают свою работу.
Хотите еще больше улучшить свой опыт? Ознакомьтесь с нашим списком лучшего программного обеспечения для Linux, чтобы узнать, что еще может вам помочь.
Какой анализатор дискового пространства вам больше всего нравится? Есть ли что-то, что я пропустил? Вы думаете, что они не нужны? Поделитесь с нами своими мыслями в комментариях ниже!
Кредиты изображений: дизайн 3D-инфографики через Shutterstock
Lightroom vs.Photoshop: в чем разница?
Хотя Photoshop и Lightroom фактически дополняют друг друга, важно знать различия.
Об авторе
Джоэл Ли
(Опубликовано 1604 статей)
Джоэл Ли имеет B.С. в области компьютерных наук и более девяти лет профессионального опыта в области написания и редактирования. Он является главным редактором MakeUseOf с 2018 года.
Ещё от Joel Lee
Подпишитесь на нашу рассылку новостей
Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!
Еще один шаг…!
Подтвердите свой адрес электронной почты в только что отправленном вам электронном письме.
.