Главное, незначительное уникальное число

Если сервером является FTP-сервер, wget развернет подстановочные знаки:

wget --no-verbose 'ftp://ftp.gnu.org/gnu/tar/*1.26*'
2012-10-02 12:02:17 URL: ftp://ftp.gnu.org/gnu/tar/*1.26* [11217] -> ".listing" [1]
2012-10-02 12:02:23 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.cpio.gz [3421172] -> "tar-1.26.cpio.gz" [1]
2012-10-02 12:02:23 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.cpio.gz.sig [189] -> "tar-1.26.cpio.gz.sig" [1]
2012-10-02 12:02:31 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.shar.gz [5246246] -> "tar-1.26.shar.gz" [1]
2012-10-02 12:02:31 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.shar.gz.sig [189] -> "tar-1.26.shar.gz.sig" [1]
2012-10-02 12:02:35 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2 [2339773] -> "tar-1.26.tar.bz2" [1]
2012-10-02 12:02:35 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2.sig [189] -> "tar-1.26.tar.bz2.sig" [1]
2012-10-02 12:02:41 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz [3435280] -> "tar-1.26.tar.gz" [1]
2012-10-02 12:02:41 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz.sig [189] -> "tar-1.26.tar.gz.sig" [1]
2012-10-02 12:02:45 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.xz [1783904] -> "tar-1.26.tar.xz" [1]
2012-10-02 12:02:45 URL: ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.xz.sig [189] -> "tar-1.26.tar.xz.sig" [1]

иначе, как sch предполагает, использовать lftp:

lftp -c mget 'http://ftp.gnu.org/gnu/tar/*1.26*'

10
11.04.2014, 12:26
3 ответа
[1133345] Из [12188] Интерфейса программирования Linux[12189], §14.1[12190] Каждый файл устройства имеет основной идентификационный номер и второстепенный идентификационный номер. Основной идентификатор идентифицирует общий класс устройства, и используется ядром для поиска соответствующего драйвер для этого типа устройств. Незначительный идентификатор уникально идентифицирует конкретное устройство в общем классе. Главный и второстепенный идентификаторы файла устройства отображаются с помощью кнопки ls -l команда.[1133827] [1133828][...][12191] Каждый драйвер устройства регистрирует свою ассоциацию с определенным основным идентификатором устройства, и эта ассоциация обеспечивает связь между специальным файлом устройства и устройством. Имя файла устройства не имеет значения, когда ядро ищет драйвер устройства.[12192]См. также эту старую (2001) [12193]Linux Device Drivers[1133939] (2e) главу[1133833].[12194]т.е. намерение состоит в том, чтобы обеспечить уникальное сопоставление major:minor с device:instance для каждого типа устройства. Строго говоря, вы [1133834] можете [1133835] иметь два разных устройства с одним и тем же мажором: минорный, если одно - char, а другое - блочный:[12195] В Linux, [1133836] в любой момент времени в одной системе [1133837] мажор:минорный номер [1133838] для каждого типа устройства [1133839] является уникальным. Однако со временем эти числа могут меняться, и не обязательно, чтобы они были одинаковыми в разных системах Linux (даже в одном и том же дистрибутиве, ядре и аппаратном обеспечении). Обратите внимание, что символьные и блочные устройства имеют различные нумерационные пробелы, например, блочный мажор 1 присваивается дискам с оперативной памятью, char мажор 1 присваивается набору устройств ядра, включая нуль и ноль.[12196]Исторически мажоры устройств были (в основном) [1133840]статически[1133841] выделены через [1133842]реестр[1133843] (также присутствуют, хотя и не присутствуют, в исходном тексте ядра [1133844]Documentation/devices.txt[1133845]). В наши дни многие устройства выделяются динамически, это управляется [1133846]udev[1133847], а сопоставления просматриваются в [1133848]/proc/devices[1133849]. Фиксированные устройства все еще существуют в [12197]incude/uapi/linux/major.h[12198](недавно перенесенные из [1133852]include/major.h[1133853])[12199]Теперь, несмотря на то, что комбинация major:minor уникально идентифицирует конкретные экземпляры устройств, ничто не мешает создавать несколько узлов (файлов) устройств, которые относятся к одному и тому же устройству. Они даже не должны быть созданы в [1133854]/dev[1133855] (но они должны быть в файловой системе, которая поддерживает создание узлов устройств, и не монтируются с опцией [1133856]nodev[1133857]). [12200]Обычно используется создание дубликатов нуля, нуля и случайных устройств в chroot:[12201]Имена - это просто псевдонимы, ядро не слишком заботится о большинстве имён или местоположений, оно заботится о мажорном числе, чтобы выбрать правильный драйвер, а драйвер (обычно) заботится о мажорном числе, чтобы выбрать правильный экземпляр. [12202] Большинство имён просто условны (хотя [1133858] некоторые определены POSIX[1133859]). Обратите также внимание, что одно устройство может регистрировать несколько основных номеров, проверьте драйвер [1133860]sd[1133861] в [1133862]/proc/devices[1133863]; имя модуля драйвера ([1133864].ko[1133865]) не обязательно должно совпадать с именем устройства, и не обязательно должно совпадать с именем узла устройства в [1133866]/dev[1133867], и один модуль драйвера может управлять несколькими логическими/физическими устройствами или именами устройств.[12203]Вкратце: у вас может быть два или более узлов устройства (в [1133868]/dev/[1133869] или в другом месте), которые имеют одинаковые мажорные:минорные номера, но если они одного типа, то они относятся к одному и тому же устройству. Вы можете иметь один драйвер, который может обрабатывать несколько мажорных экземпляров, но внутри ядра и драйвера, для каждого типа (char или block) число major:minor принимается как относящееся к конкретному устройству (major) и конкретному экземпляру (minor) устройства. [12204] Нельзя иметь два узла устройств с одинаковым типом и major:minor и ожидать, что они будут обращаться к двум разным логическим или физическим устройствам. При доступе к устройству ядро выбирает один драйвер на основании типа и мажорного номера (и [1133870]а не[1133871] на основании имени узла устройства), а по условию минор номера детерминированно выбирает конкретный экземпляр или подфункцию.[12205]Обновление[1133873]. Интересную историю и перспективы *BSD можно найти в презентации Poul-Henning Kamp's 2002 [1133874] BSDCon[1133875]: [1133876]https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/[12206] Если вы [1133878] совершили скачок назад во времени к 1978[1133879] (любезно предоставленный компанией Alcatel-Lucent, в Техническом Журнале Колокольной Системы [1133880] июля-августа 1978 г.) "[1133882]Unix Система Разделения Времени [1133883]" четко описывает ее (p1937):[12207]Устройства характеризуются основным номером устройства, второстепенным номером устройства и классом (блоком или символом). Для каждого класса имеется массив точек входа в драйверы устройств. Основной номер устройства используется для индексирования массива при вызове кода для конкретного драйвера устройства. Малый номер устройства передается драйверу устройства в качестве аргумента. Маленький номер не имеет значения, кроме того, что приписывается ему драйвером. Обычно драйвер использует младший номер для доступа к одному из нескольких идентичных физических устройств.[12208]
20
27.01.2020, 20:00
[1133377] Когда файл устройства создается по [1133886]mknode[1133887], передаются [1133888]major[1133889] и [1133890]minor[1133891] номера. Таким образом Linux идентифицирует основное аппаратное устройство, связанное с файлом устройства. В большинстве случаев они [1133892]major[1133893] идентифицируют драйвер, в то время как [1133894]minor[1133895] различает различные устройства, которыми управляет драйвер.[12209] Поскольку эти номера должны быть уникальными для каждого устройства, в противном случае невозможно будет создать правильные файлы устройств для всех из них.[1133380].
2
27.01.2020, 20:00

Нет, в Linux они не всегда уникальны.

Linux использует devptsвиртуальную файловую систему для предоставления псевдотерминалов (ptys ), и эту виртуальную файловую систему можно монтировать более одного раза и в разных местах, что удобно при настройке chroot или контейнеров пространства имен. Хотя кортеж major:minorуникален для экземпляра файловой системы devpts, он не уникален для работающей системы :

.
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

В приведенном выше примере команда script(1)создает псевдо-терминал -и запускает в нем оболочку. Чертовски очевидно, что псевдотерминал -, созданный первым процессом script, отличается от терминала, созданного вторым, но у них одинаковые имена и старшие и младшие номера.

Чтобы однозначно идентифицировать псевдотерминал, вам нужно использовать его кортеж device:inodeили объединить номер устройства (файловой системы devpts )с его major:minor. Проблема в том, что поле "tty" в/proc/PID/stat(7-м, см. справочную страницу proc(5); вот где такие инструменты, как lsofили psполучают информацию из )содержит только st_rdevtty (упакованныйmajor:minor); если это ведомое устройство pty, нет указания на файловую систему devpts, которая его предоставляет. Те же проблемы влияют на номер устройства, который можно получить с помощью TIOCGDEVioctl.

Кажется, не существует надежного способа идентифицировать управляющий терминал процесса в Linux.

2
27.01.2020, 20:00

Теги

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