Sunday, September 03, 2006

Linux - Manipulando partições de disco.

Neste artigo irei descrever como manipular partições de disco no Linux utilizando a ferramenta fdisk.
Veja abaixo a lista de conteúdo deste artigo:

1 - Dispositivos de bloco e partições
1.0 - Dispositivo de Bloco
1.1 - Partições de Disco

2 - Exibindo informações sobre partições
2.0 - Utilizando "fdisk" para exibir partições

3 - Particionando disco com a ferramenta "fdisk"
3.0 - Criando uma nova partição primária
3.1 - Criando uma nova partição estendida
3.2 - Criando partições lógicas apartir da partição estendida
3.3 - Alterando o tipo da partição
3.4 - Excluindo partições existentes
3.5 - Alterando a flag de partição "bootável"
3.6 - Saindo do "fdisk" sem salvar as alterações feitas
3.7 - Saindo do "fdisk" e salvando alterações feitas

Obs.: Neste e em outros artigos que eu escrevi a formatação do texto possui os seguintes significados:

- O texto em Negrito assume que se trata de um comando que deve ser digitado.
- O texto em Itálico significa que é a saída de um comando ou conteúdo de um arquivo.
- O ">>>" significa que você deve digitar no interpretador do Python.
- O "#" significa que o comando dever ser executado como usuário "root".
- O "$" significa que o comando deve ser executado como usuário sem privilégios.

1 - Dispositivos de bloco e partições

1.0 - Dispositivo de Bloco:

Um dispositivo de bloco é uma camada de abstração para algum dispositivo de armazenamento que pode ser formatado em blocos. Blocos individuais podem ser acessados independentemente de outros blocos. Tal acesso é frequentemente chamado de "random access" ou "acesso aleatório".

Essa camada de abstração para acesso aos blocos de dispositivos de armazenamento, permitem programas acessarem estes dispositivos de bloco sem problemas, mesmo que o dispositivo abaixo dessa camada de abstração não parece ser o que realmente é.

Exemplo: Dispositivos como disquete, disco rígido, CD, ou qualquer outro dispositivo virtual pode ser acessado por essa camada de abstração.

No Linux, os dispositivos estão localizados no diretório /dev.
Neste diretório podemos encontrar diversos dispositivos. Os dispositivos de bloco são identificados com o caractere "b" e os dispositivos de caractere são identificados com o caracterer "c".

Exemplo:

$ cd /dev
$ ls -l

brw-rw---- 1 root disk 8, 2 2006-08-30 10:40 sda2
brw-rw---- 1 root disk 8, 5 2006-08-30 10:40 sda5
brw-rw---- 1 root plugdev 8, 16 2006-08-30 10:41 sdb
brw-rw---- 1 root plugdev 8, 17 2006-08-30 10:41 sdb1
crw-rw---- 1 root audio 14, 1 2006-08-30 10:41 sequencer
crw-rw---- 1 root audio 14, 8 2006-08-30 10:41 sequencer2
crw-rw---- 1 root root 21, 0 2006-08-30 10:41 sg0

Também podemos exibir somente os dispositivos de bloco com o comando abaixo:

$ cd /dev/ ; ls -l | grep "^b"

Descrevendo o comando acima: Primeiro entra do diretório /dev/, depois executa o comando ls -l e a saída é redirecionada para o grep, que por sua vez exibe apenas os dispositivos iniciados com o caracterer "b" de "bloco".

1.1 - Partições de Disco:

Para alguns dispositivos de bloco, tal como disquetes e CD/DVD, é comum ter somente um único sistema de arquivos.
No entanto, com disco rígido e alguns dispositivos de armazenamento USB ( Pen-drive ), é possível dividir um dispositivo em vários pedaços, ou seja, ter várias partições diferentes no mesmo dispositivo.

Com isso concluimos que disquetes, Zip-disks e CD-ROMs/DVD não possuem tabela de partição. Tabelas de partição são exclusivos dos discos rígidos e de "pen-drive".

Partições podem ter diferentes tamanhos e diferentes sistemas de arquivos.
Com isso, um único disco pode ser usado para vários propósitos.
Por exemplo: Podemos instalar em um único disco rígido, vários sistemas operacionais diferentes, incluindo FreeBSD, Solaris, Linux ou Microsoft Windows, entre outros. Todos compartilhando o mesmo disco rígido.

Existem três tipos de partições: Primária, extendida e lógica.
Um disco IDE pode ter no máximo 63 partições, já um SCSI são limitados a 15 partições.
Sendo que em discos IDE temos no máximo: 4 primárias ou 3 primárias e somente uma extendida e até 59 lógicas por disco.

O Linux enumera as partições primárias ou extendida de 1 até 4. Podemos ter apenas uma partição extendida por disco.
Então, como exemplo um dispositivo hda pode ter as seguintes partições: /dev/hda1, /dev/hda2, /dev/hda3 e /dev/hda4. Ou apenas uma partição primária ( /dev/hda1 ) e uma outra partição extendida ( /dev/hda2 ).
As partições lógicas se iniciam em /dev/hda5 e é necessário ter uma partição extendida para poder criar partições lógicas dentro.

2 - Exibindo informações sobre partições:

As informações sobre partições são armazenadas na "tabela de partições", que é localizada na trilha "0" do disco rígido (MBR).
Essa tabela, lista informações sobre o início e o fim de cada partição, informações sobre o tipo de sistema de arquivos e se alguma partição esta marcada como "bootável" ou não.

Para criar ou deletar partições, é necessário editar essa tabela de partição usando um programa designado para este trabalho.
Neste artigo iremos utilizar o programa em modo texto "fdisk", mas existe muitos outro programas que podem realizar esta tarefa, incluindo programas executados sobre janelas ( Gparted ).

2.0 - Utilizando "fdisk" para exibir partições:

Para exibir a tabela de partição, utilizamos o comando "fdisk" com a opção -l.
No exemplo abaixo, estou listando o disco /dev/sda:

# fdisk -l /dev/sda

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 9541 76638051 83 Linux
/dev/sda2 9542 9729 1510110 5 Extended
/dev/sda5 9542 9729 1510078+ 82 Linux swap / Solaris

Agora vamos entender o que cada um dos campos acima diz:

Disk /dev/sda: 80.0 GB, 80026361856 bytes = Mostra o tamanho total do disco.
255 heads, 63 sectors/track, 9729 cylinders = Mostra a geometria do disco
Units = cylinders of 16065 * 512 = 8225280 bytes = mostra o resultado da multiplicação de cilindros por blocos de 512 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 9541 76638051 83 Linux
/dev/sda2 9542 9729 1510110 5 Extended
/dev/sda5 9542 9729 1510078+ 82 Linux swap/Solaris

Primeira coluna: A coluna "Device" exibe o nome das partições existentes.
Segunda colula: A coluna "Boot" exibe as partições ativas como bootável. No exemplo a partição /dev/sda1 esta ativada.
Terceira coluna: A coluna "Start" exibe o cilindro inicial.
Quarta coluna: A coluna "End" exibe o cilindro final.
Quinta coluna: A coluna "Blocks" exibe numeros de blocos em 1k ( 1024 bytes ).
Sexta coluna: A coluna "Id" exibe informação sobre o tipo da partição.
Sétima coluna: A coluna "System" exibe o nome do tipo da partição.

3 - Particionando disco com a ferramenta fdisk:

Acima mostrei como exibir informações sobre sua partição com ferramenta "fdisk". E a ferramenta "fdisk" providencia um ambiente interativo para editar a tabela de partição, criar ou remover partições.

Aviso: Antes de modificar sua tabela de partição, faça backup das informações que julgar importantes e não realize nenhuma mudança com partições importantes em uso.
E tenha certeza que você saiba o que está fazendo antes de executar alguma ação. Pois o "fdisk" não irá fazer muitas confirmações, e suas alterações não podem ser desfeitas.

Para iniciar o "fdisk" em modo interativo, passe como parâmentro para ele o nome do disco ao qual você deseja editar.
Segue um exemplo abaixo:

# fdisk /dev/hda

O número de cilindros para este disco está configurado para 4865.
Não existe nada de errado, mas isto é maior que 1024,
e pode em certas configurações causar problemas com:
1) programas que executam em tempo de inicialização (versões velhas do LILO)
2) inicialização e programas de particionamento de outros OSs
(p.ex., DOS FDISK, OS/2 FDISK)

Comando (m para ajuda):

Agora você está em modo interativo. Você pode digitar "m" para exibir a ajuda do fdisk.
Segue exemplo abaixo:

Comando (m para ajuda): m
Comando - ação
a alterna a opção "inicializável"
b edita rótulo BSD no disco
c alterna a opção "compatibilidade"
d exclui uma partição
l lista os tipos de partição conhecidos
m mostra este menu
n cria uma nova partição
o cria uma nova tabela de partições DOS vazia
p mostra a tabela de partições
q sai sem salvar as alterações
s cria um novo rótulo de disco Sun vazio
t altera a identificação da partição para o sistema
u altera as unidades das entradas mostradas
v verifica a tabela de partições
w grava a tabela no disco e sai
x funcionalidade adicional (somente para usuários avançados)

Comando (m para ajuda):

Agora vamos verificar as partições existentes como o comando "p".
Segue exemplo abaixo:

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux

Como visto no exemplo acima, a capacidade do é 40 GB ( 40020664320 bytes ).
Mas nosso disco possui 2 partições criadas: Linux swap/Solaris e Linux.
Fazendo a soma dos blocos das 2 partições 257040 + 10233405 o total é de: 10490445 Kbytes ( 10 GB ).
Agora sabemos que existe 30 GB livre para podermos criar mais partições ( bricar com o "fdisk" ).

3.0 - Criando uma nova partição primária:

Nós agora iremos criar uma nova partição primária através do comando "n" ( de new ).
É necessário digitar "n" para criar a nova partição, "p" para criar uma partição primária e o informar um número entre 1 á 4 para informar o numero da partição.
Obs.: Lembre-se que podemos ter apenas 4 partições primárias, para o nosso exemplo irei criar a nova partição primárias número 3.

Segue o exemplo abaixo para criar uma partição primária de aproximadamente 8 GB (8201181 Kbytes):

Comando (m para ajuda): n
Comando - ação
e estendida
p partição primária (1-4)
p
Número da partição (1-4): 3
Primeiro cilindro (1-4865, padrão 1): 3606
Último cilindro ou +tamanho ou +tamanho M ou +tamanho K (3606-4865, padrão 4865): +8201181K

Agora vamos verificar quais partições estão criadas com o comando "p":

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 83 Linux

Comando (m para ajuda):

3.1 - Criando uma nova partição estendida:

Agora iremos criar uma partição extendida com o resto do disco:
Segue o exemplo abaixo:

Comando (m para ajuda): n
Comando - ação
e estendida
p partição primária (1-4)
e
Partição selecionada 4
Primeiro cilindro (1-4865, padrão 1): 4628
Último cilindro ou +tamanho ou +tamanho M ou +tamanho K (4628-4865, padrão 4865):
Usando valor padrão 4865

Comando (m para ajuda):

Como visto, não foi necessário informar o último cilindro ou tamanho, pois se você não especificar nada, ele assume que o padrão é o resto do espaço livre do disco.

Para exibir as partições criadas, utilize o comando "p":
Segue o exemplo abaixo:

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 83 Linux
/dev/hda4 4628 4865 1911735 5 Estendida

Comando (m para ajuda):

3.2 - Criando partições lógicas apartir da partição estendida:

A partição estendida não "ocupa espaço em disco", mas server somente para pordermos criar as partições lógicas sobre ela. Não é possível criar partições lógicas sem ter uma partição estendida.

Agora vamos criar uma partição lógica sobre a partição extendida que acabamos de criar.
Primeiro, iremos criar uma partição lógica de 1048576 Kbytes ( 1 GB ).
Depois iremos criar a segunda partição lógica com o resto do espaço livre do disco.
Segue o exemplo abaixo:

Criando a primeira partição lógica:

Comando (m para ajuda): n
Primeiro cilindro (4628-4865, padrão 4628): 4628
Último cilindro ou +tamanho ou +tamanho M ou +tamanho K (4628-4865, padrão 4865): +1048576K

Exibindo a partição criada com o comando "p":

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 83 Linux
/dev/hda4 4628 4865 1911735 5 Estendida
/dev/hda5 4628 4759 1060258+ 83 Linux

Criando a segunda partição lógica com o resto do disco:

Comando (m para ajuda): n
Primeiro cilindro (4760-4865, padrão 4760): 4760
Último cilindro ou +tamanho ou +tamanho M ou +tamanho K (4760-4865, padrão 4865):
Usando valor padrão 4865

Exibindo a partição criada com o comando "p":

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 83 Linux
/dev/hda4 4628 4865 1911735 5 Estendida
/dev/hda5 4628 4759 1060258+ 83 Linux
/dev/hda6 4760 4865 851413+ 83 Linux

Agora temos duas partições lógicas criadas sobre a partição estendida.

3.3 - Alterando o tipo da partição:

Para alterar o tipo da partição utilizamos o comando "t" ( de type ).
Depois escolhemos qual partição queremos alterar, em seguida escolhemos o código e hexadecimal correspondente ao tipo de partição que queremos ter.
Se você não sabe qual é o código hexadecimal relacionado a partição que você quer escolher, utilize opção "L", para exibir os tipos disponíveis.

No exemplo abaixo iremos alterar o tipo da partição /dev/hda3, de "83 Linux" para "c W95 FAT32 (LBA)".

Comando (m para ajuda): t
Número da partição (1-6): 3
Código hexadecimal (digite L para listar os códigos): L

0 Vazia 1e FAT16 Win95 Esc 80 Minix antigo be Inicialização
1 FAT12 24 DOS NEC 81 Linux antigo/Mi bf Solaris
2 root XENIX 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT1
3 usr XENIX 3c Recuperação d 83 Linux c4 DRDOS/sec (FAT1
4 FAT16
5 Estendida 41 Boot PReP PPC 85 Estendida Linux c7 Syrinx
6 FAT16 42 SFS 86 Conjunto de vol da Dados Não-FS
7 HPFS ou NTFS 4d QNX4.x 87 Conjunto de vol db CP/M / CTOS / .
8 AIX 4e QNX4.x 2ª part 88 Linux texto pla de Utilitário Del
9 AIX inicializá 4f QNX4.x 3ª part 8e Linux LVM df BootIt
a Gerenc. Inicial 50 DM OnTrack 93 Amoeba e1 Acesso DOS
b W95 FAT32 51 DM6 OnTrack Aux 94 Amoeba BBT e3 DOS R/O
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e4 SpeedStor
e W95 FAT16 (LBA) 53 DM6 OnTrack Aux a0 Hibernação IB eb sist. arq. BeOS
f Win95 (LBA) Par 54 DM6 OnTrack a5 FreeBSD ee EFI GPT
10 OPUS 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
11 FAT12 Escondida 56 Golden Bow a7 NeXTSTEP f0 Inicialização
12 Diagnóstico Co 5c Edisk Priam a8 Darwin UFS f1 SpeedStor
14 FAT16 Escondida 61 SpeedStor a9 NetBSD f4 SpeedStor
16 FAT16 Escondida 63 GNU HURD ou Sys ab Inicialização f2 DOS secundário
17 HPFS ou NTFS Es 64 Novell Netware b7 sist. arq. BSDI fd Detecção auto
18 AST SmartSleep 65 Novell Netware b8 permuta BSDI fe LANstep
1b Partição Esco 70 Multi-Boot Disk bb Assistente de I ff BBT
1c FAT32 Win95 Esc 75 PC/IX
Código hexadecimal (digite L para listar os códigos): c
O tipo da partição 5 foi alterado para c (W95 FAT32 (LBA))

Comando (m para ajuda):

Exibindo a partição alterada com o comando "p":

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 c W95 FAT32 (LBA)
/dev/hda4 4628 4865 1911735 5 Estendida
/dev/hda5 4628 4759 1060258+ 83 Linux
/dev/hda6 4760 4865 851413+ 83 Linux

Comando (m para ajuda):

Note acima que a partição /dev/hda3 agora é do tipo: c W95 FAT32 (LBA)

3.4 - Excluindo partições existentes:

Para excluir partições utilizamos a opção "d" ( de delete ).
Em seguida escolhemos qual partição excluir.

Aviso: Muito cuidado ao excluir as partições, pois uma vez excluída, será excluido todos os dados existentes na partição.
Você ainda pode desfazer esta ação, saindo do "fdisk" sem salvar as alterações, utilizando a opção "q" de "quit".

Para o nosso exemplo, iremos excluir a partição /dev/hda6:

Comando (m para ajuda): d
Número da partição (1-6): 6

Exibindo a partição deletada com o comando "p":

Comando (m para ajuda): p

Disco /dev/hda: 40.0 GB, 40020664320 bytes
255 cabeças, 63 setores/trilha, 4865 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 2300 2331 257040 82 Linux swap / Solaris
/dev/hda2 * 2332 3605 10233405 83 Linux
/dev/hda3 3606 4627 8209215 c W95 FAT32 (LBA)
/dev/hda4 4628 4865 1911735 5 Estendida
/dev/hda5 4628 4759 1060258+ 83 Linux

Comando (m para ajuda):

Note acima que a partição /dev/hda6, não existe mais, pois foi excluida.
Você agora tem espaço em disco para criar mais uma partição.

3.5 - Alterando a flag de partição "bootável":

A sinalização de "partição bootável" é necessária para dizer qual partição primária será iniciada pela BIOS no processo do "post".
Partições estendidas não podem ser marcadas como "bootável".
Tanto o LILO quanto o GRUB, ou qualquer outro gerenciador de discos necessita estar em uma partição bootável.
Você pode notar que a partição atualmente bootável é a partição /dev/hda2 (Linux), que está sinalizada com * na coluna "Boot".
Na partição /dev/hda2 temos o Linux com o LILO instalado, então não será necessário alterar a partição "bootável".
Mas se a partição /dev/hda3 estivesse marcada como "bootável", e quisemos utilizar o Linux com o LILO como gerenciador de boot, deveriamos alterar a partição "bootável" para /dev/hda2.

Para alterar a partição bootável utilize o comando: a

3.6 - Saindo do "fdisk" sem salvar as alterações feitas:

As vezes é necessário, desfazer as alterações realizadas no "fdisk" estando ainda em modo interativo. Ou mesmo sair do "fdisk" sem salvar as alterações.
Para isso utilize o comando "q" ( de quit ).
Veja o exemplo abaixo:

Comando (m para ajuda): q

3.7 - Saindo do "fdisk" e salvando alterações feitas:

Todas as alterações que nós realizamos até agora com o "fdisk" foram feitas utilizando a memória RAM.
Mas agora devemos gravar essas alterações no disco.
Você deve ter certeza de que tudo está correto, pois essa ação não tem volta. Liste as partições com o comando "p" para certificar que está tudo correto.

No exemplo abaixo, iremos salvar as alterações na tabela de partição (MBR)

Comando (m para ajuda): w
A tabela de partições foi alterada!

Chamando ioctl() para reler tabela de partições.

AVISO: Re-leitura da tabela de partição falhou com erro 16: Device or resource busy.
O kernel ainda está usando a tabela antiga.
A nova tabela será usada no próximo reboot.
Sincronizando discos.
root@roberto-desktop:~#

Obs.: Como visto acima, em alguns sistemas onde existem partições em uso, as alterações teram efeito somente após um reboot do micro.
Após reiniciar seu computador, execute o comando: fdisk -l /dev/hda para listar suas partições.

Fim.

Referência:
IBM DeveloperWorks - Linux LPI - Tópico 104.

Recursos:
Guia Foca GNU/Linux - Capítulo 5 - Discos e Partições.
fdisk(8) - Linux man page.

1 Comments:

At 5:56 AM, Blogger heliane said...

de http://www.vivaolinux.com.br/artigo/Linux-Manipulando-particoes-de-disco que coisa feia.

 

Post a Comment

<< Home