# GNU Hurd

GNU Hurd (também conhecido como the Hurd ou apenas Hurd) é um micronúcleo multi-servidor escrito como parte do GNU, desenvolvido para substituir o Unix e publicado como software livre, sob a licença GNU General Public License.
O seu desenvolvimento tem sido contínuo desde 1990 pela equipe do Projeto GNU da Free Software Foundation. O GNU Hurd consiste num conjunto de protocolos e processo de servidores (ou daemons, em terminologia Unix) que correm no microkernel GNU Mach; juntando tudo, tenciona-se formar o kernel do sistema operacional GNU. O Hurd pretende ultrapassar o kernel do sistema operacional Unix em funcionalidade, segurança e estabilidade, enquanto se mantém bastante compatível a eles. O projeto GNU escolheu para o sistema operacional a arquitetura microkernel servidor–cliente, ao notar ganhos sobre o tradicional arquitetura kernel monolítico Unix. Isto é alcançado no Hurd através da implementação da especificação POSIX (entre outros), mas eliminando as restrições arbitrárias aos usuários.

## Nome e logo

Em dezembro de 1991, o arquiteto principal do Hurd explicou que "HURD" é um acrônimo indiretamente recursivo para "HIRD of Unix-Replacing Daemons", em que "HIRD" significa "HURD of Interfaces Representing Depth". A opinião que prevalece atualmente na equipe é de que Hurd é um substantivo concreto.
Ainda em estágio de desenvolvimento, os próprios (e pouquíssimos) desenvolvedores pedem ajuda a pessoas conhecedoras da Linguagem C (tanto para o desenvolvimento do núcleo quanto para o porte de aplicativos), assim como pessoas que tenham disponibilidade para efetuar testes e reportar falhas.
Como ambos "Hurd" e "Hird" são homófonos da palavra em Inglês "rebanho" (herd), o nome completo GNU Hurd também é uma brincadeira com as palavras rebanho de gnus, refletindo como o kernel funciona. O logotipo é chamado de caixas Hurd e isso também reflete na arquitetura. O logotipo é um gráfico onde os nós representam servidores do kernel Hurd e as bordas são dirigidas IPC. Mensagens
Devido ao estado da tecnologia microkernel, a sigla duplamente recursiva é muitas vezes referida pelos especialistas como a característica mais interessante do GNU Hurd.

## Desenvolvimento e história

O Richard Stallman fundou o projeto GNU em setembro de 1983 com a finalidade de criar o sistema operacional livre GNU. Inicialmente os componentes necessários para o kernel e seu desenvolvimento foram escritos: editores, shell, compilador e todos os outros. Em 1989, foi criado o GPL e "só" faltava um importante componente: o kernel.
O desenvolvimento do Hurd começou em 1990 depois de ter abandonado uma tentativa de construir o kernel em 1986, baseado na investigação do sistema operacional TRIX desenvolvido pelo professor Steve Ward e seu grupo em MIT's laboratório de informática (LCS). De acordo com Thomas Bushnell, o arquiteto inicial do Hurd, o plano inicial era adaptar o kernel 4.4BSD-Lite kernel e, em retrospecto, "É perfeitamente óbvio a mim que isto iria ter um sucesso esplêndido e que o mundo seria muito diferente hoje". Em 1987 Richard Stallman propôs utilizar o Mach microkernel desenvolvido na Universidade Carnegie Mellon (CMU). O trabalho foi atrasado três anos devido incerteza se a CMU iria liberar o código Mach numa licença correspondente.
Com a publicação do Kernel Linux em 1991, o usuário primário das ferramentas e componentes GNU de espaço de usuário em breve se tornaram sistemas operacionais construídos sobre o kernel Linux, solicitando a controvérsia do termo GNU/Linux.
Desenvolvimento do Hurd têm ocorrido lentamente. Apesar dos anúncios positivos de Stallman em 2002 prevendo a publicação do GNU/Hurd mais tarde nesse ano, o Hurd ainda não é considerado adequado para ambientes de produção. O seu desenvolvimento, em geral, não atingiu as expectativas, e ainda há bugs e falta particularidade. Isso resultou em um produto mais pobre do que muitos (inclusive o Stallman) esperavam. Em 2010, após 20 anos em desenvolvimento, Stallman disse que ele "não era muito otimista sobre o GNU Hurd. Faz algum progresso, mas para ser realmente superior seria necessário resolver muitos problemas complexos", mas acrescentou que "o acabamento não é crucial" para o sistema operacional GNU porque um kernel livre já existia (Linux), e completando Hurd não resolveria o principal problema restante para um sistema operacional livre: suporte a dispositivos.
O projeto Debian, entre outros, trabalhou no projeto Hurd para produzir distribuições binárias do Sistemas operacionais baseados em kernel Hurd para sistemas compatíveis com IBM PC.

## Arquitetura

Ao contrário da maioria de kernels Unix-like, o Hurd utiliza uma arquitetura cliente-servidor, construída em um microkernel, que é responsável por fornecer os serviços mais básicos do kernel - coordenar o acesso ao hardware: o CPU (a escalonamento de processos e gerenciamento de processos), RAM (via gerenciamento de memória), e vários outros dispositivos de entrada/saída (via agendamento I/O) para som, gráficos, armazenamento de massa, etc. Em teoria, o projeto microkernel permitiria a todos os drivers de dispositivo serem construídos como servidores que trabalham em espaço do usuário, mas hoje a maioria dos drivers desse tipo é ainda contida no espaço do kernel no GNU Mach.
De acordo com os desenvolvedores do Hurd, a principal vantagem do projeto baseado em microkernel é a capacidade de estender o sistema: o desenvolvimento de um novo módulo não exige conhecimento profundo do resto do kernel e um bug em um módulo não trava o sistema inteiro. Hurd fornece um conceito de tradutores, uma estrutura de módulos usados ​​para estender a funcionalidade do sistema de arquivos
Desde cedo, o Hurd foi desenvolvido para usar GNU Mach como o microkernel. Esta foi uma decisão técnica feita por Richard Stallman, que pensou que iria acelerar o trabalho de salvar uma grande parte dela. Ele admitiu que estava errado sobre isso. Outros sistemas Unix-like que trabalham no Mach microkernel incluem OSF/1, Lites e MkLinux. Mac OS X e NeXTSTEP usam núcleos híbridos baseados no Mach.

### Outros microkernels

De 2004 em diante, vários esforços foram lançados para portar o Hurd para microkernels mais modernos. O L4 microkernel era a escolha original em 2004, mas desacelerou a um impasse. No entanto, em 2005, o desenvolvedor Hurd, Neal Walfield, terminou a estrutura de gerenciamento de memória inicial para a porta L4/Hurd e Marcus Brinkmann portou as partes essenciais de glibc, ou seja, obteve o código de inicialização do processo de trabalho, permitindo assim que os primeiros programas de usuários (os triviais, como o programa Olá Mundo em C) possam ser executados.
Desde 2005, Brinkmann e Walfield começaram a pesquisar sobre o Coyotos como um novo kernel para HURD. Em 2006, Brinkmann conheceu Jonathan Shapiro (o principal arquiteto do sistema operacional Coyotos) para ajudar e discutir o uso do kernel Coyotos para GNU/Hurd. Uma discussão mais aprofundada dos desenvolvedores HURD levou a conclusão de que o Coyotos (bem como outros núcleos similares) não são adequados para o Hurd.
Em 2007, os desenvolvedores do Hurd, Neal Walfield e Marcus Brinkmann, fizeram uma crítica da arquitetura Hurd, conhecida como "a crítica", e uma proposta de como o futuro sistema pode ser projetado, conhecido como "o papel de posição". Em 2008, Neal Walfield começou a trabalhar no microkernel Viengoos como um kernel nativo moderno para HURD. A partir de 2009, o desenvolvimento em Viengoos está em pausa devido à falta de tempo que Walfield tem para trabalhar nele.
Enquanto isso, os outros continuaram a trabalhar na variante Mach do Hurd.

### Extensões Unix

Uma série de conceitos tradicionais do Unix são substituídos ou extensíveis no Hurd.
No Unix, cada programa em execução tem um user id associado, que normalmente corresponde ao usuário que iniciou o processo. Este id amplamente dita as ações permitidas para o programa. Nenhum processo exterior pode mudar o ID de usuário de um programa em execução. Um processo Hurd, por outro lado, é executado sob uma set no IDs de usuário, que pode conter vários ids, um ou nenhum. Um processo suficientemente privilegiado pode adicionar e remover ids para outro processo. Por exemplo, existe um servidor de senha que irá distribuir ids em troca de uma senha de login correta.
Quanto ao sistema de arquivos, um programa adequado pode ser designado como um tradutor para um único arquivo ou uma hierarquia de diretório inteiro. Todo o acesso ao processo traduzido, ou abaixo de uma hierarquia de arquivos, no segundo caso, é, de fato, processado pelo programa. Por exemplo, um arquivo tradutor pode simplesmente redirecionar operações de ler e escrever para outro arquivo, e não ao contrário de um link simbólico Unix. O efeito montagem do Unix é alcançado através da criação de um sistema de arquivos tradutor (usando o comando "settrans"). Os tradutores também podem ser usados ​​para fornecer serviços ao utilizador. Por exemplo, o tradutor ftpfs permite que um usuário encapsule sites FTP remotos dentro de um diretório. Em seguida, as ferramentas padrão, como ls, cp e rm podem ser usados para manipular arquivos no sistema remoto. Mesmo os tradutores mais poderosos são aqueles, como UnionFS, que permitem um usuário unificar vários diretórios em um, listando, assim, o diretório unificado revela o conteúdo de todos os diretórios (um recurso que está faltando em muitos sistemas Unix, embora disponível nos modernos BSDs).
O Hurd requer um boot loader compatível com multiboot, como o GRUB.

### A arquitetura dos servidores

De acordo com a documentação Debian existem 24 servidores (18 servidores centrais e seis servidores do sistema de arquivos) nomeados da seguinte forma:

#### Servidores Núcleo

* auth (servidor de autenticação): Recebe solicitações e senhas de programas e dá-lhes um ID, que muda os privilégios do programa.
* crash (servidor de travamento): Aceita todos os erros fatais.
* exec (servidor de execução): Traduz uma imagem executável (corrente ELF e a.out que são suportadas) rodando uma imagem executável na memória.
* fifo (tradutor FIFO): Implementa pipes nomeados.
* new-fifo (novo servidor FIFO): Um servidor alternativo para pipes nomeados.
* firmlink (o tradutor firmlink): Implementa firmlinks - "a meio caminho entre a link simbólico e um link duro"
* fwd (servidor forward): encaminha solicitações para outros servidores, usado por servidores de FIFO e symlink.
* hostmux (servidor de multiplexador host)
* ifsock (servidor para a interface de sockets): Ajuda com domínio endereços de soquetes UNIX.
* init (servidor init): O sistema básico de inicialização e configuração.
* magic (servidor magic): Sinaliza que uma pesquisa de nome deve ser resolvida internamente por um processo quando o resultado envolve o estado do mesmo.
* null (servidor null): Implementa /dev/null e [/dev/zero /dev/zero].
* pfinet (servidor pfinet): Implementa o protocolo da familia PF_INET.
* pflocal (servidor pflocal): Implementos soquetes de domínio Unix.
* proc (servidor process): Atribui PID s e gere ações a nível de processo.
* symlink (tradutor link simbólico): Implementa links simbólicos para os sistemas de arquivos que não os suportam.
* term (servidor de terminal): Um terminal POSIX.
* usermux (servidor de usuário multiplexador): Invoca tradutores específicos do usuário.

#### Servidores do Sistema de Arquivos
##### Ext2fs

    O tradutor para o sistema de arquivos ext2. Ele recebe blocos de disco do microkernel e dando arquivos e diretórios para as aplicações.

##### Isofs

    O tradutor para o sistema de arquivos ISO 9660. Traduz blocos de um CD ou DVD para arquivos e diretórios para as aplicações.

##### Nfs

    Veja Network File System.

##### Ufs

    Tradutor para o sistema de arquivos BSD com o mesmo nome, UFS.

##### Ftpfs

    File Transfer Protocol tradutor de sistema de arquivo.

##### Storeio

    O tradutor de armazenamento.
Os servidores, coletivamente, implementam o POSIX API com cada servidor implementando parte da interface. Por exemplo, os vários servidores de sistemas de arquivos individualmente implementam as chamadas de sistema de arquivos. O servidor de armazenamento vai funcionar como uma camada de wrapping, semelhante à camada de bloqueio do Linux. O equivalente a VFS no Linux é conseguido através libdiskfs e bibliotecas libpager.

## Distribuições GNU rodando Hurd

As distribuições baseadas em Hurd GNU incluem:
* Arch Hurd
* Debian GNU/Hurd
* NixOS
* Bee GNU/Hurd (descontinuado)
* Gentoo GNU Hurd (descontinuado)
* GNU/Hurd Live CD (descontinuado)