Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅

πŸ–₯ Linux ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: ΠΊΠ°ΠΊ mknod ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΆΠ΅Π»Π΅Π·ΠΎ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это магия Π½ΠΎΠΌΠ΅Ρ€ 133

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ "всё Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»" Π² Linux часто Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³ΠΎΠ²Ρ‹ΠΉ слоган, хотя Π½Π° самом Π΄Π΅Π»Π΅ это Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ дСрТится вся систСма. Жёсткий диск /dev/sda, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» /dev/tty ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΡ‹ΡˆΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкстовый Ρ„Π°ΠΉΠ». Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ вопрос: ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ физичСская ΠΆΠ΅Π»Π΅Π·ΠΊΠ° Π²ΠΎΠΎΠ±Ρ‰Π΅ оказываСтся Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС? Вся магия упираСтся Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ²: mknod. На Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ x86_64 Ρƒ Π½Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ 133. ИмСнно ΠΎΠ½ создаёт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ ядро ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ этому ΠΏΡƒΡ‚ΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ mknod Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ выдСляСт Π±Π»ΠΎΠΊΠΈ Π½Π° дискС. ВмСсто хранСния Π΄Π°Π½Π½Ρ‹Ρ… создаётся связка ΠΏΡƒΡ‚ΠΈ с ΠΏΠ°Ρ€ΠΎΠΉ чисСл: major ΠΈ minor. Major-Π½ΠΎΠΌΠ΅Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ядру Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Π° minor-Π½ΠΎΠΌΠ΅Ρ€ уточняСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ устройство Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Π‘Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΡ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ядро Π±ΡŒΡ‘Ρ‚ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π±Π΅Π· поиска. ИмСнно поэтому ΠΊΠΎΠΌ

πŸ–₯ Linux ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: ΠΊΠ°ΠΊ mknod ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΆΠ΅Π»Π΅Π·ΠΎ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это магия Π½ΠΎΠΌΠ΅Ρ€ 133

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ "всё Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»" Π² Linux часто Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³ΠΎΠ²Ρ‹ΠΉ слоган, хотя Π½Π° самом Π΄Π΅Π»Π΅ это Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ дСрТится вся систСма. Жёсткий диск /dev/sda, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» /dev/tty ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΡ‹ΡˆΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкстовый Ρ„Π°ΠΉΠ». Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ вопрос: ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ физичСская ΠΆΠ΅Π»Π΅Π·ΠΊΠ° Π²ΠΎΠΎΠ±Ρ‰Π΅ оказываСтся Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС?

Вся магия упираСтся Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ²: mknod. На Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ x86_64 Ρƒ Π½Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ 133. ИмСнно ΠΎΠ½ создаёт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ ядро ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ этому ΠΏΡƒΡ‚ΠΈ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ mknod Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ выдСляСт Π±Π»ΠΎΠΊΠΈ Π½Π° дискС. ВмСсто хранСния Π΄Π°Π½Π½Ρ‹Ρ… создаётся связка ΠΏΡƒΡ‚ΠΈ с ΠΏΠ°Ρ€ΠΎΠΉ чисСл: major ΠΈ minor. Major-Π½ΠΎΠΌΠ΅Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ядру Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Π° minor-Π½ΠΎΠΌΠ΅Ρ€ уточняСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ устройство Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Π‘Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΡ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ядро Π±ΡŒΡ‘Ρ‚ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π±Π΅Π· поиска.

ИмСнно поэтому ΠΊΠΎΠΌΠ°Π½Π΄Π° cat /dev/urandom Π½Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π±Π°ΠΉΡ‚ с накопитСля. Ѐайловая систСма Π²ΠΈΠ΄ΠΈΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π», пСрСнаправляСт запрос Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл ядра, ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ бСсконСчный ΠΏΠΎΡ‚ΠΎΠΊ энтропии. На дискС ΠΏΡ€ΠΈ этом Π½Π΅ Π»Π΅ΠΆΠΈΡ‚ Ρ€ΠΎΠ²Π½Ρ‹ΠΌ счётом Π½ΠΈΡ‡Π΅Π³ΠΎ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ созданиС Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΡƒΠ·Π»Π° фактичСски Π΄Π°Ρ‘Ρ‚ прямой доступ ΠΊ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ ядра, Π²Ρ‹Π·ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ capability CAP_MKNOD. Π‘Π΅Π· ΠΏΡ€Π°Π² процСсс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ EPERM ΠΈ быстро ΠΏΠΎΠΉΠΌΡ‘Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π°Π²Π°Ρ‚ΡŒ доступ ΠΊ ΠΆΠ΅Π»Π΅Π·Ρƒ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ядро Π½Π΅ собираСтся. Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°Ρ€ΡŒΠ΅Ρ€ бСзопасности ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€Π°Π² Π½Π° Ρ„Π°ΠΉΠ»Ρ‹.

НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ /dev/null. Major-Π½ΠΎΠΌΠ΅Ρ€ 1 Π² ядрС Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ memory devices, Π° minor-Π½ΠΎΠΌΠ΅Ρ€ 3 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° null. Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ root.

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/sysmacros.h>

#include <stdio.h>

int main(void) {

// 1 = major number for memory devices

// 3 = minor number for the null device

dev_t dev = makedev(1, 3);

// S_IFCHR creates a character device file

if (mknod("my_null", S_IFCHR | 0666, dev) == -1) {

perror("mknod failed (try running with sudo)");

return 1;

}

printf("Successfully created my_null!\n");

return 0;

}

ПослС компиляции ΠΈ запуска появится Ρ„Π°ΠΉΠ» my_null, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΊΠ°ΠΊ исходный /dev/null. Π›ΡŽΠ±ΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² этот Ρ„Π°ΠΉΠ», ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый null-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ядра. Π Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с систСмным /dev/null Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅.

Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Unix Π² своё врСмя свСли Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΆΠ΅Π»Π΅Π·ΠΎΠΌ ΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ опСрациям. ВмСсто дСсятков Ρ€Π°Π·Π½Ρ‹Ρ… API для дисков, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΈ сСти программист ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс read, write, open ΠΈ close. А вся слоТная ΠΌΠ°Ρ‚Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов прячСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ mknod ΠΈ ΠΏΠ°Ρ€Ρ‹ major/minor.