Para que serve realmente a partição / boot?

40

Estou lendo um texto relativamente antigo sobre partições Linux e sistemas de arquivos (a Bíblia de certificação LPIC 1 ). Diz:

Algumas versões dos carregadores de inicialização do Linux não podem acessar um kernel que está fora dos primeiros 1024 cilindros em um disco. Ao colocar a partição / boot no início da unidade, você pode ter certeza de que não terá problemas ao acessar o kernel na inicialização. Esse problema aparece com mais freqüência nos casos de inicialização dupla do Linux, juntamente com outro sistema operacional que está na primeira partição.

Por que um carregador de inicialização " não tem acesso ao kernel fora dos primeiros 1024 cilindros em um disco "?

Além disso, o que significa " colocar a partição / boot no início da unidade " significa?

SRYZDN
fonte
Isso não é mais verdade, então você quer razões históricas?
muru
sim, mas por que ainda temos o diretório / boot nas partições linux?
SRYZDN
6
"Não é mais verdade" pode ser o caso se a leitura for literal, mas há muitos layouts de disco modernos que a maioria dos gerenciadores de inicialização não consegue ler. O ZFS não pode ser lido por muita coisa; btrfs-on-LVM, da mesma forma. Coloque seu kernel e initrd em um RAID1 ext3 / ext4 simples e evite qualquer número de dores de cabeça.
Charles Duffy
A API originalmente fornecida pelo gerenciador de inicialização pelo BIOS para obter o kernel Linux do disco rígido só tinha espaço para 1023 setores, ou seja, o início da unidade. A /bootpartição foi explicitamente aplicada para estar nessa área para garantir que o kernel possa ser carregado.
Thorbjørn Ravn Andersen

Respostas:

34

Essa é uma limitação imposta por ter um BIOS e um gerenciador de inicialização muito antigos, e não o próprio Linux. O BIOS só poderia acessar os primeiros 1024 cilindros do disco (veja aqui para obter mais informações sobre o que são cilindros / cabeças / setores). Essa limitação se estenderia aos gerenciadores de inicialização que, devido à sua natureza simples, não teriam seus próprios drivers de disco e usariam os serviços do BIOS para acessar o disco.

Isso significava que tanto o carregador de inicialização quanto o kernel (uma vez que é tarefa do carregador de inicialização carregá-lo) teriam que estar dentro dos primeiros 1024 cilindros em sistemas com essa limitação. Uma maneira simples de fazer isso era criar uma /bootpartição separada contendo o kernel e colocá-la no início da unidade (geralmente apenas tornando-a a primeira partição). Isso significa que ele residiria fisicamente nos primeiros 1024 cilindros, desde que a partição não fosse muito grande.

A limitação não é mais um problema porque se aplica apenas a BIOSs antigos. Além disso, muitos gerenciadores de inicialização modernos (por exemplo, GRUB) têm seus próprios drivers de disco e, portanto, não precisam confiar nos serviços do BIOS. Os gerenciadores de inicialização modernos podem usar /bootpara outros fins, mas não é mais necessário estar em uma partição separada e dentro dos primeiros 1024 cilindros (embora existam muitos casos em que é necessário ter /bootuma partição separada).

Graeme
fonte
5
Isso é verdade, mas, como está escrito atualmente, implica que os sistemas modernos podem ficar sem um separado /boot. Isso muitas vezes não é verdade - principalmente porque o LVM e os sistemas de arquivos modernos sofisticados com funcionalidade de camada de bloco incorporada criam raízes.
Charles Duffy
3
@ Charles, acho que não, tomei o cuidado de colocar meu " e " em itálico por esse motivo exato.
Graeme
@CharlesDuffy - sistemas modernos - mesmo aqueles com camadas fs sofisticadas - podem facilmente ficar sem /bootno sentido convencional. /booté tradicionalmente dedicado a um gerenciador de inicialização - mas a maioria dos computadores fabricados nos últimos anos vem com um gerenciador de inicialização integrado ao firmware - embora, por qualquer motivo, a prática comum ainda seja instalar gerenciadores de inicialização anacrônicos como grubamigos e ignorar sua funcionalidade em favor de complicação, eu acho. No entanto, os gerenciadores de inicialização de firmware exigem uma partição dedicada - mas geralmente não tem muito a ver /boot.
mikeserv
11
@mikeserv, eh? Você está se referindo à EFI? A EFI suporta explicitamente FAT12, FAT16 e FAT32; se estiver tentando carregar um kernel com algo como o ZFS, ainda é necessário um sistema de arquivos mais simples. Se isso tem ou não algo a ver /booté puramente específico da configuração.
Charles Duffy
11
De fato, não é verdade que isso não seja mais um problema. Às vezes me deparo com máquinas relativamente novas (com 5 anos de idade) com esses problemas. É verdade que os BIOS são peças estúpidas de firmware, mas ainda existem.
Ruslan
23

A história

/bootcontém arquivos que não são usados ​​pelo sistema operacional, mas por seu carregador de inicialização . Você encontrará os arquivos do próprio gerenciador de inicialização (como o /boot/grub/*Grub) e o kernel do Linux ( /boot/vmlinuz*) e, frequentemente, um initrd ou initramfs associado .

Em um PC com BIOS herdado (em oposição ao UEFI mais recente encontrado nos computadores mais recentes), o software na ROM carrega os primeiros 512 bytes do disco de inicialização na memória (o setor de inicialização ). Com apenas 512 bytes (nem todos contêm código: alguns contêm dados como a tabela de partições), o código não pode fazer muito - não pode haver um driver de disco real. Tudo o que pode ser feito em um espaço tão limitado é usar uma interface do BIOS para carregar mais código. Essa interface fornece um comando para carregar o enésimo setor no disco - e o tamanho de N é limitado, portanto, apenas o início do disco pode ser alcançado dessa maneira.

A interface do BIOS evoluiu um pouco nas três décadas anteriores, mas suas limitações de tamanho têm se esforçado para acompanhar o tamanho dos discos, fazendo com que BIOSes e gerenciadores de inicialização mais antigos atinjam 32 MB, 512 MB, 2 GB, 8 GB (e possivelmente outros limites que não me lembro). O carregador de inicialização precisa poder usar a interface do BIOS para carregar todas as peças necessárias para acessar diretamente a unidade de disco. Os gerenciadores de inicialização geralmente não contêm drivers para todos os controladores de disco existentes, portanto, tudo até carregar o kernel do Linux (e o initrd / initramfs) precisa usar a interface do BIOS e, portanto, caber no início do disco.

Observe que isso é uma limitação do BIOS ou do carregador de inicialização, não do próprio Linux ou de uma distribuição.

Separe /boothoje

Em um sistema com um BIOS recente e um carregador de inicialização recente, ou com UEFI, as limitações de tamanho não são mais relevantes: os tamanhos de disco agora têm muito tempo para serem atualizados. No entanto, existem outros casos de uso que tornam /bootútil uma partição separada . Ele permite que o sistema principal esteja em um dispositivo RAID que o carregador de inicialização não suporta, ou em um tipo de sistema de arquivos que o carregador de inicialização não suporta. Ele permite que o sistema principal esteja em um dispositivo criptografado, que o Linux pode descriptografar, mas não o gerenciador de inicialização.

Se nenhuma dessas limitações e casos de uso se aplicar a você, manter /bootcomo uma partição separada não será útil. Mas eles afetam pessoas suficientes que a maioria da distribuição apóia.

Gilles 'SO- parar de ser mau'
fonte
22

Outro motivo além do problema mencionado no BIOS é que uma /bootpartição separada permite o uso de um sistema de arquivos para o /volume que o carregador de inicialização não entende (sem estar limitado ao carregamento da lista de bloqueios, como com lilo).

Hauke ​​Laging
fonte
Isso teria relevância particular ao inicializar o Linux em uma máquina virtual?
Tom Russell
11
@ TomRussell Não, esse aspecto não está relacionado.
Hauke ​​Laging 04/03/19
18

A inicialização é difícil

Inicializando ... bem ... é realmente a parte mais difícil. Toda vez que um computador é inicializado, ele se encontra basicamente de novo. Ele se familiariza com suas várias partes e, para cada uma delas, ganha capacidade. Mas ele tem que se sustentar com suas próprias instruções, por assim dizer, da estaca zero toda vez.

Ao projetar um processo de inicialização, o truque é elevar a máquina em etapas. O boot deve ser rápido e confiável, e deve ser as duas coisas em um ambiente completamente desconhecido de cada vez . Eu nem vou me aventurar em uma conversa no modo Real / Protegido (o que não significa que eu pudesse) , mas há muita coisa acontecendo na inicialização. À medida que o computador assimila seus vários componentes cada vez que o faz em etapas graduadas. Provavelmente o mais crucial deles é a mudança da execução do código on-board para a execução do código no disco ou, em outras palavras, o executor do kernel. É quando o firmware (ostensivamente) se rende ao sistema operacional.

Muitos anos atrás, esse não era o caso. Antes, o BIOS era realmente o Basic In / Out - programas regulares faziam chamadas para o firmware para coisas como desenhar a tela e acessar o disco. Isso se chamava interrupções - os antigos podem se lembrar melhor das emoções de alegria que costumavam encontrar ao atribuir IRQs para sua nova matriz de pontos ou USR.

INT13H

É a série de funções 13H de interrupção ( ou INTna linguagem do assembly ) que o BIOS oferece como serviços para acesso ao disco. Eles ainda hoje são usados ​​nos sistemas BIOS no processo de inicialização para fazer o salto do firmware para o disco.

Um sistema BIOS verifica os primeiros bytes de cada disco encontrado e procura um padrão que reconheça como um registro mestre de inicialização ( ouMBR ) . Esse é um padrão de fato de décadas e inclui um pouco de binário executável bruto, que é gravado na cabeça do disco. O MBR marca um disco do BIOS como inicializável. Ele irá parar de verificar quando encontrar um, e praticamente um é tudo o que você obtém sem truques inteligentes. Quando encontra um, mapeia-o para a memória e executa-o (no modo Real, mas ainda não vou para lá) .

O MBR executado quase definitivamente não é o kernel do sistema - 512 bytes (mais ou menos) seriam bastante inúteis nesse departamento. Provavelmente, este é um gerenciador de inicialização - um programa projetado especificamente para superar uma das muitas limitações de endereçamento da BIOS - especificamente que ele não entende nenhum tipo de sistema de arquivos.

Quando o bootloader lê no kernel real e executa -lo na memória (como todos nós orar ele será cada vez) , ele provavelmente irá fazê-lo, pedindo o BIOS através de uma INT13Hchamada de interrupção. E se não - muitos gerenciadores de inicialização mais sofisticados montam sistemas de arquivos no sentido convencional e executam o código de outra maneira -, é muito pouco provável que o gerenciador de inicialização seja tão sofisticado sem um INT13Hou dois. Freqüentemente, os gerenciadores de inicialização precisam carregar-se em cadeia - ou em vários estágios - porque os 512 bytes alocados pela primeira vez não atendem nem mesmo às suas necessidades.

FRANGO E OVO

Tudo isso é uma maneira indireta de discutir o disco, eu sei, mas a essa altura deve ficar bem claro que o problema principal - pode-se chamá-lo de tipo de ovo e galinha - é acessar o disco que contém as instruções do programa sobre como acessar discos . A chave para esse problema é o firmware - e continua sendo de maneiras muito diferentes, mesmo nos sistemas EFI - e, mais fraco ou não, o firmware é o link mais importante na cadeia de inicialização.

Veja bem, quando o kernel é executado, e todas as suas inúmeras rotinas para acessar e controlar o hardware são iniciadas, todos esses problemas desaparecem (ou pelo menos mudam um pouco) , porque os sistemas operacionais modernos assumem o controle total de um sistema, mas até que os limites do sistema se estendam apenas até o limite permitido pelo firmware. Isso está dizendo muito - o BIOS não mudou muito desde o 8086. A INT13Hchamada é original do 8086. Sim, houve (inúmeras) extensões e hacks, é claro, mas inovações ...?

MELHOR E MELHOR

A maioria das alterações no BIOS foram meras ataduras, na melhor das hipóteses. Costumava ser um disco rígido, precisava ser mapeado fisicamente - vários aspectos específicos de sua geometria eram referidos quando os dados eram armazenados ou recuperados. Eventualmente, o disco rígido convencional cresceu para um tamanho que proibia isso. Mesmo apenas o mapa abstrato era muita informação para um BIOS suportar. Como ele pode operar apenas no Modo Real, o BIOS é limitado a 1 MB por registro de memória. Encha o mapa de cilindros com tamanho maior que isso ou faça com que qualquer uma de suas propriedades seja maior do que pode ser tratada em tantos bits, e o BIOS está literalmente perdido - fora dos limites.

Essa barreira foi encontrada e quebrada muitas vezes. Cada vez que o mapa é abstraído e codificado de uma maneira mais nova, inteligente e menos precisa. E, atualmente, é literalmente impossível para um BIOS mapear com precisão uma unidade. O endereçamento de bloco lógico é o padrão de fato agora, embora algumas traduções de Cilindro / Cabeça / Setor (ou CHS) ainda sejam necessárias. O que o firmware da placa principal perdeu em precisão / responsabilidade, essas extensões abstraíram e adicionaram às responsabilidades do firmware do disco para preencher as lacunas.

É este jogo de gato e rato que é mencionado na sua pergunta. Quando o BIOS não consegue entender um disco além de um certo ponto devido ao seu tamanho, todos os dados que você deseja recuperar para você na inicialização - como um carregador de inicialização ou kernel - provavelmente não devem estar localizados além desse ponto. Isto é de onde /bootveio.

TALVEZ REALMENTE MELHOR

Hoje em dia, essas coisas são, felizmente, tornadas irrelevantes pelo desaparecimento da BIOS. Nos próximos 30 anos, ele foi amplamente substituído nos últimos anos pelo padrão UEFI (ou EFI 2.0) . O UEFI fornece uma montagem a partir do primeiro minuto, inicializa no Modo Protegido, incorpora seu próprio carregador de inicialização, fornece armazenamento variável de memória flash persistente à reinicialização, é especificado para lidar com alguns zetabytes ou qualquer outro por disco ... outro. Está longe de ser perfeito, mas é uma grande melhoria em relação ao seu antecessor.

Mesmo os argumentos para gerenciadores de inicialização especializados que envolvem criptografia de disco ou sistemas de arquivos em camadas ficam vazios quando você considera que tudo isso deve ser tratado pelo kernel do sistema operacional de qualquer maneira e, se você fornecer uma montagem na inicialização, sempre terá uma visão clara. chance de executá-lo (especialmente considerando que o kernel do Linux, em sua configuração padrão, é um executável por EFI por si só) .

Portanto, uma /bootpartição separada provavelmente não deve lhe interessar demais e, se você estiver em um sistema EFI, provavelmente já terá um analógico na partição do sistema EFI, pois esse é um requisito para inicializar o modo EFI.

mikeserv
fonte
8

A existência de um /bootdiretório é historicamente determinada e, a partir daí, "corrigida" no Padrão de Hierarquia do Sistema de Arquivos . Ter esse padrão permite que os programas (e administradores de sistemas) esperem determinados arquivos em determinados locais. Nesse caso, os arquivos associados ao processo de inicialização.

Ter uma /bootpartição no início de um disco fazia sentido para BIOS mais antigos que não eram capazes de indexar blocos / setores em toda a gama de unidades disponíveis. Por esse motivo, as informações que devem ser carregadas devem estar em um setor que possa ser indexado, portanto, uma partição separada (com baixo número de setor) para a /bootqual o BIOS pode carregar dados / programas adicionais (que, por sua vez, foram capazes de lidar com o problema completo). faixa de disco sem usar o BIOS).

Anthon
fonte
6

Também pode ser muito ordenado ter uma partição / inicialização separada. Na minha máquina, tenho muitas distribuições e backups, cada um em suas próprias partições, mas todos compartilham a mesma partição / boot, que é onde residem todos os kernels para todo o sistema operacional. Além disso, todas as distros apontam para a minha única e única cópia do lilo.conf, que também está em / boot, então nunca preciso adivinhar o que diabos está acontecendo quando adiciono kernels, distros, o que for. Aqui está um trecho do meu lilo.conf:

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y5--5-Debian1"
label  = y5:D1:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y8--5-Debian2"
label  = y8:D2:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y11-5-Debian3"
label  = y11:D3:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=w5--5-Debian1"
label  = w5:D1:16.0-4

... esses são apenas meus backups do Debian em dois discos. Veja como é fácil acompanhar os kernels? (agora, todos os backups usando o mesmo kernel).

Ray Andrews
fonte
5

Embora em sistemas modernos, os setores de um arquivo possam ser acessados ​​em qualquer lugar do disco, ainda faz sentido limitar os materiais de inicialização à sua própria partição de inicialização, simplesmente a partir do princípio de "não coloque todos os ovos em uma cesta".

Suponha que o sistema de arquivos principal esteja corrompido de forma que um carregador de inicialização de estágio inferior não consiga ler o próximo estágio corretamente. Se os materiais do carregador de inicialização estiverem em sua própria partição, o kernel poderá aparecer e lidar adequadamente com a partição raiz corrompida via fsck. Isso pode estar em sua própria partição.

A partição de inicialização pode oferecer opções de "resgate", como montar uma partição raiz alternativa. Além disso, e se você inicializar vários sistemas operacionais em diferentes partições? Os materiais de inicialização não pertencem a nenhum desses sistemas. É razoável que ele tenha sua própria partição. Você pode substituir qualquer uma das partições do sistema operacional por um sistema operacional diferente, mas conseguir inicializar os sistemas operacionais restantes.

Além disso, e se você gostaria de usar um sistema de arquivos para sua partição principal que o gerenciador de inicialização não entende? Ou, digamos, para qual suporte do lado do carregador de inicialização é apenas experimental? Em situações como essa, um arquivo no momento da inicialização ainda pode ser usado se houver um mapa do setor (e o carregador de inicialização suporta uma coisa dessas: o bom e velho LILO do carregador de inicialização Linux usava mapas do setor e, portanto, não precisava entender o sistema de arquivos estrutura de todo). Mas os mapas setoriais são inerentemente esquisitos. Se o sistema de arquivos for reorganizado, os setores se movimentam e, portanto, os mapas do setor ficam incorretos e devem ser regenerados, caso contrário, o sistema não poderá ser reinicializado.

Por fim, existe o princípio organizacional de que, mesmo que você não tenha uma partição real, ainda é uma boa idéia que todo o material de inicialização esteja no mínimo oculto /boote não esteja espalhado em nenhum outro lugar.

Kaz
fonte
5

Isso não era uma limitação da distribuição Linux, mas uma limitação dos BIOS mais antigos. Naqueles dias, para garantir que o Linux pudesse inicializar, todos os arquivos relacionados à inicialização foram colocados em sua própria partição, que foi a primeira partição no disco rígido para garantir que o carregador de inicialização caísse dentro dos primeiros 1024 cilindros. Crie uma partição menor que o tamanho encontrado nos cilindros 1024 (varia de disco rígido para disco rígido). Mas se você criar uma primeira partição maior que esse limite, é possível que os arquivos do carregador de inicialização estejam localizados fora dos cilindros 1024 e o BIOS não possa carregá-los.

Você também pode obter o mesmo efeito criando duas pequenas partições, ambas dentro dos primeiros 1024 cilindros, e colocando todos os arquivos do carregador de inicialização no segundo.

Michael Martinez
fonte
4

Outro motivo para a partição de inicialização atualmente:

  • inicializando a partir do NFS ou NBD
  • partição raiz criptografada
  • / boot compartilhado entre distribuições diferentes
todos
fonte