
Existem arquivos especiais no Linux que não são realmente arquivos.
Os exemplos mais notáveis e claros deles estão na dev
pasta, "arquivos" como:
/dev/null
- Ignora tudo o que você escreve no arquivo/dev/random
- Produz dados aleatórios em vez do conteúdo de um arquivo/dev/tcp
- Envia todos os dados que você grava neste arquivo pela rede
Em primeiro lugar, qual é o nome desses tipos de “arquivos” que na verdade são algum tipo de script ou binário disfarçado?
Em segundo lugar, como eles são criados? Esses arquivos estão embutidos no sistema no nível do kernel ou existe uma maneira de criar você mesmo um "arquivo mágico" (que tal um /dev/rickroll
)?
Responder1
/dev/zero
é um exemplo de "arquivo especial" - particularmente, um "nó de dispositivo". Normalmente eles são criados pelo processo de instalação da distribuição, mas você podetotalmentecrie-os você mesmo, se quiser.
Se você perguntar ls
sobre /dev/zero
:
# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5 Nov 5 09:34 /dev/zero
O "c" no início indica que este é um "dispositivo de personagem"; o outro tipo é "dispositivo de bloco" (impresso ls
como "b"). Grosso modo, dispositivos de acesso aleatório, como discos rígidos, tendem a ser dispositivos de bloco, enquanto itens sequenciais, como unidades de fita ou placas de som, tendem a ser dispositivos de caracteres.
A parte "1, 5" é o "número do dispositivo principal" e o "número do dispositivo secundário".
Com essas informações, podemos usar o mknod
comando para criar nosso próprio nó de dispositivo:
# mknod foobar c 1 5
Isso cria um novo arquivo chamado foobar
, na pasta atual, que nãoexatamentea mesma coisa que /dev/zero
. (É claro que você pode definir permissões diferentes se desejar.) Tudo o que esse "arquivo" realmente contém são os três itens acima - tipo de dispositivo, número maior, número menor. Você pode usar ls
para procurar os códigos de outros dispositivos e recriá-los também. Quando você ficar entediado, basta usar rm
para remover os nós do dispositivo que você acabou de criar.
Basicamente, o número maior informa ao kernel do Linux com qual driver de dispositivo conversar, e o número menor informa ao driver de qual dispositivo você está falando. (Por exemplo, você provavelmente tem um controlador SATA, mas talvez vários discos rígidos conectados a ele.)
Se você quiserinventarnovos dispositivos que fazem algo novo... bem, você precisará editar o código-fonte do kernel Linux e compilar seu próprio kernel personalizado. Então não vamos fazer isso! :-) Mas você pode adicionar arquivos de dispositivo que dupliquem aqueles que você já possui. Um sistema automatizado como o udev basicamente apenas observa eventos do dispositivo e liga mknod
para rm
você automaticamente. Nada mais mágico do que isso.
Ainda háoutrotipos de arquivos especiais:
O Linux considera um diretório um tipo especial de arquivo. (Normalmente você não pode abrir um diretório diretamente, mas se pudesse, descobriria que é um arquivo normal que contém dados em um formato especial e informa ao kernel onde encontrar todos os arquivos nesse diretório.)
Um link simbólico é um arquivo especial. (Mas um link físico não é.) Você pode criar links simbólicos usando o
ln -s
comando. (Procure a página de manual para isso.)Há também uma coisa chamada "pipe nomeado" ou "FIFO" (fila primeiro a entrar, primeiro a sair). Você pode criar um com
mkfifo
. Um FIFO é um arquivo mágico que pode ser aberto pordoisprogramas de uma só vez – uma leitura, uma escrita. Quando isso acontece, funciona como um tubo normal. Mas você pode iniciar cada programa separadamente...
Um arquivo que não é "especial" de forma alguma é chamado de "arquivo normal". Ocasionalmente, você verá menção a isso na documentação do Unix. Isso é o que significa; um arquivo que não é um nó de dispositivo ou um link simbólico ou qualquer outra coisa. Apenas um arquivo normal, diário, sem propriedades mágicas.
Responder2
A maioria das /dev
entradas são inodes de dispositivos de bloco ou inodes de dispositivos de caracteres.Wikipedia tem muitos detalhessobre isso, o que não vou repetir.
Mas /dev/tcp
o que é mencionado na sua pergunta não é explicado por nenhuma das respostas existentes. /dev/tcp
e /dev/udp
são diferentes da maioria das outras /dev
entradas. Os dispositivos de bloco e caractere são implementados pelo kernel, mas /dev/tcp
são /dev/udp
implementados no modo de usuário.
O shell bash é um programa que possui uma implementação de /dev/tcp
e /dev/udp
(copiado de ksh93
). Quando você tenta abrir um caminho abaixo daqueles com operadores de redirecionamento bash, ele não executará uma open
chamada de sistema comum. Em vez disso, o bash criará um soquete TCP e o conectará à porta especificada.
Isso é implementado em modo usuário e apenas em alguns programas como pode ser visto no exemplo a seguir que demonstra a diferença entre deixar bash
e cat
tentar abrir/dev/tcp/::1/22
$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
A diferença é ksh93
que bash
só fará aquelas conexões TCP com operadores de redirecionamento, e não em outros locais onde possa abrir arquivos como o source
ou .
builtin.
Responder3
Além dos nós de dispositivos explicados em outras respostas (criados commknod(2)ou fornecido por algumdevfs), o Linux possui outros arquivos "mágicos" fornecidos porsistemas de arquivos virtuais, em particular em /proc/
(verprocesso(5), Ler sobreprocf) e em /sys/
(leia sobresysfs).
Esses pseudo arquivos (que aparecem - por exemplo, paraestatística(2)- como arquivos comuns, não como dispositivos) são uma visualização virtual fornecida pelo kernel; em particular, lendo /proc/
(por exemplo, com cat /proc/$$/maps
ou poraberto(2)-ing /proc/self/status
no seu programa) geralmente não envolve nenhuma E/S física do disco ou da rede, portanto é bastante rápido.
Para criar algum pseudo-arquivo adicional, /proc/
você geralmente deve escrever seu própriomódulo do kernele carregue-o (veja, por exemplo,esse).
Responder4
Como outros usuários já explicaram detalhadamente, arquivos especiais requerem código para fazer backup deles. No entanto, ninguém parece ter mencionado que o Linux oferece várias maneiras de escrever esse código no espaço do usuário:
A. FUSÍVEL(Sistema de arquivos no USErspace) permite que você escreva algo /proc
sem risco de travar o kernel e faça isso em uma linguagem/tempo de execução de sua escolha, comoIr,Node.js,Perl,PHP,Pitão, Rubi,Ferrugem,etc..
Ele também tem a vantagem de que os sistemas de arquivos FUSE podem ser montados sem eles, sudo
porque eles são executados enquanto o usuário faz a montagem.
Aqui estão alguns exemplos de coisas que as pessoas escreveram usando o FUSE:
- mp3fs(Veja seus arquivos FLAC como arquivos MP3 que são criados instantaneamente quando você os copia/clica e arrasta para o seu MP3 player)
- PyTagsFS(Veja sua mídia em uma árvore de pastas virtuais construídas a partir de tags de metadados)
- fusível-zip(Monte arquivos Zip como pastas)
- Fusível ISO(Montar ISOs sem permissões de root)
- iFUSE(Montar iDevices)
- FusívelDAV(Montar compartilhamentos WebDAV)
- fusível-exfat(Montar sistemas de arquivos formatados em exFAT)
- NTFS-3G(ODriver Linux NTFS)
B.Se você deseja criar um dispositivo de entrada virtual como teclado, mouse, joystick, etc. (por exemplo, para escrever um driver de espaço de usuário para um dispositivo USB com o qual você está conversando libusb
), háentrada.
As ligações para isso são mais difíceis de encontrar, mas sei que existem paraIr(somente teclado),Pitão, eRubi (2).
Exemplos de uso de entrada no mundo real incluem:
- G15Daemon(Driver Linux para LCD e teclas de jogos nos teclados para jogos Logitech G15)
- ds4drv(Driver para controladores Sony DualShock 4)
- xboxdrv(Driver alternativo do controlador XBox 360 e Linux equivalente aox360cejogos tão mal projetados comoRunner2: Futura Lenda do Alienígena do Ritmopodem pensar que estão falando com um controle de XBox real quando não estão)
- Os antigos drivers do Wiimote gostamcwiidque eram necessários antes que alguém finalmente escrevesse um driver kernel do Wiimote para que o suporte estivesse disponível por padrão.
C.Para dispositivos de caracteres genéricos, háCUSA(Dispositivos de caracteres no USErspace). Porém, é muito menos popular.
O único usuário da API CUSE que conheço pessoalmente é o mesmo programa que motivou sua criação:osspd, que implementa /dev/dsp
, /dev/adsp
e /dev/mixer
(a API de áudio OSS) no espaço do usuário para que possam ser roteados por meio de PulseAudio ou dmix.
A única ligação CUSE que consegui encontrar éfofo, que não é atualizado desde 2010.
D.Talvez você não precise de um novo arquivo especial.
Por exemplo, você pode abrir a comunicação bruta com qualquer dispositivo USB usandolibusb(Lista de ligações na página) e então comunicar-se com outros programas através de algum outro mecanismo (soquetes TCP/UDP, leitura/gravação de stdin/stdout ou arquivos regulares em disco, etc.).