Вопрос или проблема
Linux Mint 20.3
Давайте найдем объяснение неоднозначному поведению утилиты lsblk, применяемой с опцией -E.
Вот вывод без применения опции -E.
Вы можете увидеть, что в колонке SIZE есть повторяющиеся записи. Это (loop0 loop2) и (loop6 loop10).
greg@mynt23:~$ lsblk -o NAME,SIZE
NAME SIZE
loop0 164,8M
loop1 4K
loop2 164,8M
loop3 55,4M
loop4 73,9M
loop5 66,2M
loop6 449M
loop7 91,7M
loop8 44,4M
loop9 40,9M
loop10 449M
loop11 74,1M
loop12 55,7M
sda 298,1G
├─sda1 4,9G
├─sda2 104,2G
└─sda3 189,1G
Теперь примените опцию -E.
greg@mynt23:~$ lsblk -o NAME,SIZE -E SIZE
NAME SIZE
loop1 4K
loop3 55,4M
loop4 73,9M
loop5 66,2M
loop7 91,7M
loop8 44,4M
loop9 40,9M
loop11 74,1M
loop12 55,7M
sda 298,1G
├─sda1 4,9G
├─sda2 104,2G
└─sda3 189,1G
Повторяющиеся записи из колонки SIZE полностью исчезли, оставив одну “оригинальную” запись. Оставлены должны были быть loop0 и loop6.
Примените RM или TYPE в качестве ключа. Вы увидите, что все дубликаты удалены, но “оригинальная” запись осталась. В руководстве говорится, что дубликаты удаляются, а не дубликаты вместе с тем, что они дублируют.
Как это объяснить?
Из руководства по lsblk
:
-E
,--dedup column
Используйте колонку в качестве ключа для удаления дубликатов из выходного дерева. Если ключ недоступен для
устройства или если устройство является разделом, а родительское устройство-диск предоставляет тот же ключ, то устройство
всегда выводится.
Таким образом, удаление дубликатов по SIZE даст наблюдаемое поведение.
Ответ или решение
Вопрос о неоднозначных принципах, которыми руководствуется утилита lsblk
при использовании опции -E
для удаления дубликатов в выводимых записях, требует детального рассмотрения. Понимание утилиты lsblk
и ее опций важно для пользователей Linux, работающих с разделами дисков и томами.
Теория
Утилита lsblk
, представляющая собой сокращение от "list block devices," показывает информацию о всех блочных устройствах в системе. Среди различных опций, доступных в этой утилите, опция -E
(или --dedup
) привлекает внимание тем, что позволяет пользователю убирать дублирующие записи из вывода на основе указанного столбца.
Строка из man-страницы lsblk
гласит:
-E
,--dedup column
Использует указанный столбец в качестве ключа для дедупликации выходного дерева. Если ключ недоступен для устройства или устройство является разделом, а родительское устройство предоставляет тот же ключ, то устройство всегда будет выведено.
Из этого следует, что lsblk
будет использовать значение указанного столбца для идентификации и удаления дубликатов. Когда дубли определяются по значению в конкретном столбце (например, SIZE
), утилита оставляет только первую встреченную запись, а остальные, считающиеся дубликатами по указанному критерию, убираются из вывода.
Пример
Рассмотрим предоставленный пример для better understand the behavior of -E
option:
Без применения опции -E
:
greg@mynt23:~$ lsblk -o NAME,SIZE
NAME SIZE
loop0 164,8M
loop1 4K
loop2 164,8M
loop3 55,4M
loop4 73,9M
loop5 66,2M
loop6 449M
loop7 91,7M
loop8 44,4M
loop9 40,9M
loop10 449M
loop11 74,1M
loop12 55,7M
sda 298,1G
├─sda1 4,9G
├─sda2 104,2G
└─sda3 189,1G
Здесь видно, что loop0
и loop2
имеют одинаковую величину размера (164,8М), как и loop6
и loop10
(449M).
С применением опции -E SIZE
:
greg@mynt23:~$ lsblk -o NAME,SIZE -E SIZE
NAME SIZE
loop1 4K
loop3 55,4M
loop4 73,9M
loop5 66,2M
loop7 91,7M
loop8 44,4M
loop9 40,9M
loop11 74,1M
loop12 55,7M
sda 298,1G
├─sda1 4,9G
├─sda2 104,2G
└─sda3 189,1G
Рассматривая поведение -E SIZE
, мы видим, что удаляются все дубликаты, оставляя уникальные по значению размеры. Упоминание о том, что в выводе останутся только loop0
и loop6
, является заблуждением. На самом деле, утилита сохраняет первый встреченный элемент и удаляет все последующие. В данном случае, идентичные по размеру loop2
и loop10
подверглись удалению.
Применение
Понимание и способность объяснять принципы действия утилиты является критичным для системных администраторов и IT-специалистов, которые работают с файловыми системами и нуждаются в их оптимизации и управлении. В частности, знание о -E
опции может быть полезно, например, когда для документации или отчетности нужно собрать уникальные записи устройств по какой-то характеристике, чтобы избежать избыточности и сложностей восприятия.
В профессиональном контексте знание тонкостей lsblk
и способности управлять ее выводом может значительно упростить задачи, связанные с инвентаризацией и реорганизацией блочных устройств, а также повысить точность скриптов автоматизации в управлении дисковыми пространствами.
В конечном итоге, понимание, что lsblk
с -E
проверяет только индекс первого появления значения для его сохранения в выводе и это поведение корректно описано в документации, избавляет пользователей от путаницы и позволяет эффективно использовать эту функциональность в профессиональной деятельности.