LINUX.ORG.RU

bash-ем узнать место, доступное по указанному пути

 ,


0

1

Файловая система Linux одна, а вот устройств, к ней подцепленных, может быть много. Свободное место это свойство устройств, а программа устанавливается в указанный путь файловой системы.

Монтирование устройств раньше выполнялось при помощи команды mount, а теперь при помощи юнитов systemd. Я предполагаю, что информация о смонтированных устройствах как-то доступна

В виде записей в файле /proc/mounts по строчке на точку монтирования:

  • The 1st column specifies the device that is mounted.
  • The 2nd column reveals the mount point.
  • The 3rd column tells the file-system type.
  • The 4th column tells you if it is mounted read-only (ro) or read-write (rw).
  • The 5th and 6th columns are dummy values designed to match the format used in /etc/mtab.

Этот вопрос закрыт на stackoverflow - https://stackoverflow.com/questions/479276/how-to-find-out-the-free-disk-spac...
(потому что они неправильно модерируют)

Вопрос был о том, нужен ли /dev для узнавания свободного места по имени устройства или не нужен, задавал его дважды, никто не ответил.

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

df ~ --block-size=1 --output="avail"
       Avail
568533991424
вдруг такой программы нет, или она выводит в несовместимом формате (не зря же там ключ "--portability" есть в мане). Однако, как эта программа работает - непонятно. Откуда она берёт свою информацию - из /dev или нет?

Задавали и такой вопрос - https://unix.stackexchange.com/questions/399373/get-file-system-free-space-in...
И там написано, что информация получается системным вызовом из ядра, никаких /dev !!!

1) Portage решает задачу установки файлов в файловую систему
2) глушение вывода не нужно (потому что лучше фильтрованные логи), но если очень надо, то можно
3) для узнавания свободного места /dev не требуется

Таким образом, конкретно portage можно было бы написать таким образом, чтобы он не требовал наличия /dev.

То, что какие-то другие программы, вроде autotools, используют /dev/null - это не относится к проекту portage. А чтобы сделать всё хорошо, надо улучшать все доступные места. Например portage.

★★★

Последнее исправление: Shushundr (всего исправлений: 1)

Проверяй. Чистый /dev/ из stage3.

└─> ls -la /mnt/experimental/dev/ | grep -vE '(disk|tty)'
итого 12
drwxr-xr-x  3 root root  4096 дек 19  2021 .
drwxr-xr-x 21 root root  4096 авг  8 18:19 ..
crw-------  1 root root 5,  1 дек 19  2021 console
crw-------  1 root root 1,  6 дек 19  2021 core
lrwxrwxrwx  1 root root    15 дек 19  2021 fd -> ../proc/self/fd
crw-rw-rw-  1 root root 1,  7 дек 19  2021 full
drwxr-xr-x  2 root root  4096 дек 19  2021 input
-rw-r--r--  1 root root     0 дек 19  2021 .keep
-rw-r--r--  1 root root     0 июл  8  2021 .keep_sys-apps_makedev-0
crw-r-----  1 root kmem 1,  1 дек 19  2021 mem
crw-rw-rw-  1 root root 1,  3 дек 19  2021 null
crw-r-----  1 root kmem 1,  4 дек 19  2021 port
crw-rw-rw-  1 root root 5,  2 дек 19  2021 ptmx
crw-r--r--  1 root root 1,  8 дек 19  2021 random
lrwxrwxrwx  1 root root    17 дек 19  2021 stderr -> ../proc/self/fd/2
lrwxrwxrwx  1 root root    17 дек 19  2021 stdin -> ../proc/self/fd/0
lrwxrwxrwx  1 root root    17 дек 19  2021 stdout -> ../proc/self/fd/1
crw-r--r--  1 root root 1,  9 дек 19  2021 urandom
crw-rw-rw-  1 root root 1,  5 дек 19  2021 zero
└─> grep -R '/dev/' /mnt/experimental/usr/lib/python3.10/site-packages/portage/ 2>/dev/null | grep -vE '(null|#)'
/mnt/experimental/usr/lib/python3.10/site-packages/portage/process.py:for _fd_dir in ("/proc/self/fd", "/dev/fd"):
/mnt/experimental/usr/lib/python3.10/site-packages/portage/process.py:if platform.system() in ("FreeBSD",) and _fd_dir == "/dev/fd":
/mnt/experimental/usr/lib/python3.10/site-packages/portage/package/ebuild/config.py:                    with open("/dev/tty", "w") as f:
А потом можно будет пройтись по зависимостям:
sys-apps/portage-3.0.39-r1:
 [  0]  sys-apps/portage-3.0.39-r1
 [  1]  dev-python/pypy3-7.3.9_p9
 [  1]  dev-lang/python-3.8.15_p3
 [  1]  dev-lang/python-3.9.15_p3
 [  1]  dev-lang/python-3.10.8_p3
 [  1]  dev-lang/python-3.11.0_p2
 [  1]  app-arch/tar-1.34
 [  1]  dev-lang/python-exec-2.4.9
 [  1]  sys-apps/sed-4.8
 [  1]  sys-devel/patch-2.7.6-r4
 [  1]  app-text/xmlto-0.0.28-r9
 [  1]  app-text/docbook-xml-dtd-4.4-r3
 [  1]  dev-python/sphinx-5.3.0
 [  1]  dev-python/sphinx-epytext-0.0.4
 [  1]  net-misc/rsync-3.2.4-r3
 [  1]  sys-apps/file-5.43-r1
 [  1]  sys-apps/coreutils-8.32-r1
 [  1]  acct-user/portage-0
 [  1]  app-arch/zstd-1.5.2-r3
 [  1]  sys-apps/findutils-4.9.0-r1
 [  1]  app-shells/bash-5.1_p16-r2
 [  1]  app-admin/eselect-1.4.20
 [  1]  app-portage/gemato-16.2
 [  1]  sec-keys/openpgp-keys-gentoo-release-20220101
 [  1]  app-crypt/gnupg-2.2.39
 [  1]  sys-apps/sandbox-2.29
 [  1]  sys-apps/util-linux-2.37.4
 [  1]  app-misc/pax-utils-1.3.5
 [  1]  sys-libs/libselinux-3.4
 [  1]  sys-apps/install-xattr-0.8
 [  1]  app-arch/xz-utils-5.2.7
 [  1]  dev-vcs/git-2.37.4
 [  1]  dev-python/setuptools-65.5.1

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

То, что внутри stage3 есть /dev я верю. Но это неважно.

Дальше идёт поиск по каким-то исходникам, неясно по каким.
Я предполагаю, что первое это
lib/portage/process.py#L60
второе это
lib/portage/package/ebuild/config.py#L3133

Вероятно комментатор хотел мне показать, что /dev используется внутри портажа. Верно, используется сейчас. Однако используется ли оно для полезного функционала, или для вспомогательного? Первое использование - это закрывание лишних файловых дескрипторов, а второе это проверка идет ли вывод на консоль или нет. Даже не так, это в случае исключения при каких-то там обстоятельствах идёт попытка вывода на консоль. Открывать /dev/tty явно совершенно не было необходимости.

Зависимости да, тоже надо просматривать. Но в принципе, достаточно исправить только portage и запустить что останется без dev, тогда использование /dev в зависимостях само найдётся (думаю, что его там нет).

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 3)
Ответ на: комментарий от Shushundr

Дальше идёт поиск по каким-то исходникам, неясно по каким.

В смысле, неясно? Это portage. Вот, начинай исправления отсюда. Где явно идут обращения. Потому уже можно идти искать неявные.

shell-script ★★★★★
()

Таким образом, конкретно portage можно было бы написать таким образом, чтобы он не требовал наличия /dev.

Может, ещё и без использования fopen и mmap обойдёмся?

Aceler ★★★★★
()
Ответ на: комментарий от AnDoR

Судя по предыдущему топику, ему лень при переходе в chroot вводить

mount --rbind /dev/ /mnt/dev
mount --make-rslave /mnt/dev/
При этом /proc/ почему-то не смущает. Скоро он ещё про /sys/ узнает... Потом про /run...

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Там есть еще более ранний топик. ТС создаёт chroot не распаковывая stage3, а с запустив lxc-create. А потом, почему-то вместо запуска контейнера (lxc-start), делает chroot на rootfs контенера и тогда emerge не работает, так как проверят /dev. Значит нужно сделать, чтобы emerge и в таких условиях работал.

mky ★★★★★
()
Ответ на: комментарий от mky

почему-то вместо запуска контейнера (lxc-start), делает chroot
почему-то

Потому что в контейнер надо логиниться, а для этого надо настроить пароль и какой-нибудь /etc/ssh/sshd_config

Shushundr ★★★
() автор топика