6 октября Карел Жак (Karel Žák) анонсировал новую версию (на данный момент rc1, однако среди отличий между rc1 и релизом будут только исправления ошибок) пакета util-linux, содержащего основные системные утилиты для современных дистрибутивов GNU/Linux. Серьёзных изменений нет, за исключением libsmartcols, где было сделано много улучшений.
cal(1)
стал дружелюбнее к пользователю. Теперь можно указывать название месяца (напр., cal Январь 2017
) и использовать относительные временные отметки, например:
$ cal now
$ cal '1 year ago'
$ cal '+2 months'
В fdisk(8)
появилась поддержка очистки только что созданных разделов. Эту особенность можно контролировать через опцию --wipe-partitions[==auto|never|default]
.
По умолчанию в интерактивном режиме пользователю будет предложен выбор, если найдена подпись ФС или RAID. План состоит в том, чтобы новые блочные устройства можно было использовать без коллизий и дополнительного шага wipefs(8)
(команды форматирования вроде mkfs
и пользователи часто не очищают устройство сами).
findmnt --verify
, возможно, наиболее привлекательное улучшение для администраторов. Команда сканирует /etc/fstab
и пробует проверить конфигурацию. Опция --verify
, в отличие от традиционной команды для проверки конфигурации mount -a
, не использует mount(2)
, но проверяет корректность синтаксиса, конвертацию LABEL/UUID в пути, порядок точек монтирования, поддержку используемых ФС. Опция --verify
вместе с --verbose
показывает много деталей.
Например, мои файловые системы:
# findmnt --verify --verbose -t ext4
/
[ ] target exists
[ ] LABEL=ROOT translated to /dev/sda4
[ ] source /dev/sda4 exists
[ ] FS type is ext4
[W] recommended root FS passno is 1 (current is 2)
/boot
[ ] target exists
[ ] UUID=c5490147-2a6c-4c8a-aa1b-33492034f927 translated to /dev/sda2
[ ] source /dev/sda2 exists
[ ] FS type is ext4
/home
[ ] target exists
[ ] UUID=196972ad-3b13-4bba-ac54-4cb3f7b409a4 translated to /dev/sda3
[ ] source /dev/sda3 exists
[ ] FS type is ext4
/home/misc
[E] unreachable on boot required target: No such file or directory
[ ] UUID=e8ce5375-29d4-4e2f-a688-d3bae4b8d162 translated to /dev/sda5
[ ] source /dev/sda5 exists
[ ] FS type is ext4
0 parse errors, 1 error, 1 warning
Теперь mount(8)
отклоняет запросы на создание очередного устройства и монтирования файловой системы для одинаковых backing-файлов. Команда losetup --nooverlap
использует заново блочное устройство (loop), если оно уже существует для того же backing-файла. Вся функциональность подсчёта со смещением и лимит размера, конечно же, присутствует. Так что без проблем можно иметь несколько регионов (разделов) в одном файле образа и монтировать их все одновременно. Ограничение в том, что регионы не должны пересекаться. Спасибо Stanislav Brabec из Suse!
Heiko Carstens из IBM улучшил lscpu(1)
для s390. Добавлена поддержка топологических уровней «drawer», статической и динамической тактовой частоты, типа устройства и новая опция --physical
.
Пожалуй, самое важное изменение в libsmartcols — это улучшенная поддержка многострочных ячеек. Теперь библиотека поддерживает пользовательские функции для обёртки ячеек, что позволяет разделить текст на несколько ячеек по словам, переносам строк и т. д. Посмотрите на вывод таблицы с многострочными ячейками (колонка WRAPNL
):
TREE ID PARENT WRAPNL
aaaa 1 0 aaa
├─bbb 2 1 bbbbb
│ ├─ee 5 2 hello
│ │ baby
│ └─ffff 6 2 aaa
│ bbb
│ ccc
│ ddd
├─ccccc 3 1 cccc
│ │ CCCC
│ └─gggggg 7 3 eee
│ ├─hhh 8 7 fffff
│ │ └─iiiiii 9 8 g
│ │ hhhhh
│ └─jj 10 7 ppppppppp
└─dddddd 4 1 dddddddd
DDDD
DD
Другое изменение — это поддержка заданных пользователем символов заполнения. Мы используем эту возможность для LIBSMARTCOLS_DEBUG_PADDING=on|off
, например:
$ LIBSMARTCOLS_DEBUG=all LIBSMARTCOLS_DEBUG_PADDING=on findmnt 2> /dev/null
TARGET............................... SOURCE.......................... FSTYPE......... OPTIONS
/.................................... /dev/mapper/fedora_x1carbon-root ext4........... rw,relatime,seclabel,data=ordered
├─/sys............................... sysfs........................... sysfs.......... rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/kernel/security............. securityfs...................... securityfs..... rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup................... tmpfs........................... tmpfs.......... ro,nosuid,nodev,noexec,seclabel,mode=755
│ │ ├─/sys/fs/cgroup/systemd......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd
│ │ ├─/sys/fs/cgroup/devices......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,devices
│ │ ├─/sys/fs/cgroup/perf_event...... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,perf_event
│ │ ├─/sys/fs/cgroup/pids............ cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,pids
│ │ ├─/sys/fs/cgroup/hugetlb......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,hugetlb
│ │ ├─/sys/fs/cgroup/blkio........... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,blkio
│ │ ├─/sys/fs/cgroup/net_cls,net_prio cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,net_cls,net_prio
│ │ ├─/sys/fs/cgroup/cpu,cpuacct..... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,cpu,cpuacct
│ │ ├─/sys/fs/cgroup/memory.......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,memory
│ │ ├─/sys/fs/cgroup/cpuset.......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,cpuset
│ │ └─/sys/fs/cgroup/freezer......... cgroup.......................... cgroup......... rw,nosuid,nodev,noexec,relatime,freezer
│ ├─/sys/fs/pstore................... pstore.......................... pstore......... rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/firmware/efi/efivars........ efivarfs........................ efivarfs....... rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/selinux.................. selinuxfs....................... selinuxfs...... rw,relatime
│ ├─/sys/kernel/debug................ debugfs......................... debugfs........ rw,relatime,seclabel
│ ├─/sys/kernel/config............... configfs........................ configfs....... rw,relatime
│ └─/sys/fs/fuse/connections......... fusectl......................... fusectl........ rw,relatime
├─/proc.............................. proc............................ proc........... rw,nosuid,nodev,noexec,relatime
│ ├─/proc/sys/fs/binfmt_misc......... systemd-1....................... autofs......... rw,relatime,fd=26,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=13520
│ └─/proc/fs/nfsd.................... nfsd............................ nfsd........... rw,relatime
├─/dev............................... devtmpfs........................ devtmpfs....... rw,nosuid,seclabel,size=3982524k,nr_inodes=995631,mode=755
│ ├─/dev/shm......................... tmpfs........................... tmpfs.......... rw,nosuid,nodev,seclabel
│ ├─/dev/pts......................... devpts.......................... devpts......... rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000
│ ├─/dev/hugepages................... hugetlbfs....................... hugetlbfs...... rw,relatime,seclabel
│ └─/dev/mqueue...................... mqueue.......................... mqueue......... rw,relatime,seclabel
├─/run............................... tmpfs........................... tmpfs.......... rw,nosuid,nodev,seclabel,mode=755
│ ├─/run/user/42..................... tmpfs........................... tmpfs.......... rw,nosuid,nodev,relatime,seclabel,size=798952k,mode=700,uid=42,gid=42
│ └─/run/user/1000................... tmpfs........................... tmpfs.......... rw,nosuid,nodev,relatime,seclabel,size=798952k,mode=700,uid=1000,gid=1000
│ └─/run/user/1000/gvfs............ gvfsd-fuse...................... fuse.gvfsd-fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
├─/tmp............................... tmpfs........................... tmpfs.......... rw,nosuid,nodev,seclabel
├─/boot.............................. /dev/sda2....................... ext4........... rw,relatime,seclabel,data=ordered
│ └─/boot/efi........................ /dev/sda1....................... vfat........... rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro
├─/home.............................. /dev/mapper/fedora_x1carbon-home ext4........... rw,relatime,seclabel,data=ordered
└─/var/lib/nfs/rpc_pipefs............ sunrpc.......................... rpc_pipefs..... rw,relatime
Igor Gnatenko из Red Hat продолжает работать над обёрткой для libsmartcols на Python, смотрите https://github.com/ignatenkobrain/python-smartcols и пример ниже по тексту.
Идея использовать libsmartcols для форматирования вывода DNF (пакетного менеджера для дистрибутивов, основывающихся на RPM, замены YUM) — это ещё одна причина, по которой библиотека libsmartcols была сильно расширена и улучшена в последних релизах.
#!/bin/python3
import smartcols
tb = smartcols.Table()
name = tb.new_column("NAME")
name.tree = True
age = tb.new_column("AGE")
age.right = True
ggf = tb.new_line()
ggf[name] = "John"
ggf[age] = "70"
gfa = tb.new_line(ggf)
gfa[name] = "Donald"
gfa[age] = "50"
fa = tb.new_line(gfa)
fa[name] = "Benny"
fa[age] = "30"
ln = tb.new_line(fa)
ln[name] = "Arlen"
ln[age] = "5"
ln = tb.new_line(fa)
ln[name] = "Gerge"
ln[age] = "7"
fa = tb.new_line(gfa)
fa[name] = "Berry"
fa[age] = "32"
ln = tb.new_line(ggf)
ln[name] = "Alex"
ln[age] = "44"
print(tb)
NAME AGE
John 70
├─Donald 50
│ ├─Benny 30
│ │ ├─Arlen 5
│ │ └─Gerge 7
│ └─Berry 32
└─Alex 44
На этом всё. Спасибо Werner Fink, Sami Kerola, Ruediger Meier и многим другим!
>>> Оригинал