Servidor NFS

NFS – Network File System

Introdução

Em uma rede, sempre é desejável ter um servidor para compartilhar arquivos pois é basicamente através dos arquivos que usuários e máquinas trocam informações pela rede.

Quando se trata de compartilhamento de arquivos em ambientes mistos (Linux e Windows, por exemplo), geralmente a escolha é utilizar o Samba, e costuma-se utilizar o NFS – Network File System para compartilhar arquivos em ambientes Linux.

O NFS foi desenvolvido para permitir uma máquina compartilhar seus arquivos e diretórios com outros sistemas através da rede. Dessa forma, os usuários e programas podem acessar arquivos em sistemas remotos como se fossem arquivos locais.

Configuração do Servidor

Para instalar o NFS no Debian, são necessários os pacotes listados no comando abaixo:

# apt-get install nfs-kernel-server nfs-common portmap

Onde:

  • nfs-kernel-server – Responsável por iniciar o serviço NFS.
  • nfs-common – utilitários e arquivos comuns ao lado servidor e cliente do NFS.
  • portmapDaemon de porta dinâmica para serviços RPC – Remote Procedure Call – é um protocolo que permite a um host utilizar uma função localizada em um outro host remoto.

Algumas informações adicionais sobre o portmap. Ele permite a troca de mensagens, na qual a origem (cliente) envia parâmetros a um servidor e fica esperando um retorno, que fornecerá o resultado da função remota.

Por padrão, portmap escuta na porta 111/tcp, onde a conexão inicial é feita; em seguida ele negocia negocia um intervalo de portas TCP (geralmente acima de 1024) que será utilizada para transferências posteriores de dados; deve ser executado tanto no lado servidor como cliente.

Após realizar a instalação, para compartilhar diretórios através da rede, é necessário editar o arquivo /etc/exports. Ao configurar o arquivo, tenha em mente as seguintes regras:

  1. Apenas exporte diretórios abaixo do /.
  2. Não exporte um subdiretório de um diretório que já foi exportado, exceto se o subdiretório reside em uma partição diferente.
  3. Exporte apenas sistemas de arquivos locais.

Arquivo /etc/exports

O arquivo /etc/exports atua como lista de controle de acesso para sistemas de arquivos que podem ser exportados para clientes NFS e possui a seguinte estrutura:

<diretório a ser exportado> host(opções)

Por padrão, definimos o diretório a ser compartilhado e depois quais hosts poderão acessar esse diretório, podendo ainda utilizar as seguintes opções:

  • ro – compartilhar apenas para leitura (read only)
  • rw – compartilhar para leitura e gravação (read write)
  • root_squash – Opção padrão, proíbe o root ter acesso privilegiado no compartilhamento, isto é, o root será um usuário com privilégios limitados.
  • no_root_squash – Contrário da opção acima, root é utilizado com todos seus privilégios.
  • async – Permite que o NFS transfira arquivos de forma assíncrona, sem precisar esperar pela resposta do cliente a cada pacote enviado. Essa opção aumenta um pouco a velocidade de transferência de dados, porém aumenta a possibilidade de perda destes em caso de queda de conexão.
  • sync – Mais lento em relação à opção async, garante que os dados do arquivo em cache na memória é automaticamente gravado em disco após a conclusão da transferência dos mesmos.
  • subtree_check – Utilizado quando um subdiretório do sistema de arquivo local é exportado, mas os demais não. Com essa opção, o NFS verifica se cada requisição do cliente é para um arquivo que está na área exportada ou não. Porém, se o arquivo for renomeado ou movido de lugar, essa opção pode causar perda de desempenho no acesso dos clientes. Utilize essa opção se você precisa ter certeza de que ninguém pode acessar arquivos fora da parte exportada de um sistema de arquivos local. De preferência, crie partições de modo a exportar o sistema de arquivos inteiros. A opção padrão utilizada no NFS é no_subtree_check.

Para conhecer mais opções do arquivo, consulte a página do manual:

# man 5 exports

Agora que já conhecemos o arquivo de configuração, apresento aqui um cenário para demonstrar exemplo de uso do NFS.

Cenário

Pequena empresa que possui um servidor Linux que concentra os arquivos dos usuários e que já está chegando ao seu limite de espaço em disco. Foi adquirido um novo servidor com maior capacidade de armazenamento.

O esquema de particionamento para o compartilhamento de arquivos será da seguinte forma:

  • /data/backup – diretório de backup
  • /data/homolog – arquivos de homologação que os programadores disponibilizam para os clientes realizarem seus testes
  • /data/reports – contém relatórios que os usuários baixam para análise
  • /home – home dos usuários

Permissões de acesso aos diretórios compartilhados:

  • /data/backup – Acesso de leitura e escrita somente para a máquina 192.168.0.254
  • /data/homolog – Acesso de leitura e escrita para máquinas que estão no domínio nixi.org
  • /data/reports – Acesso somente de leitura para a rede 192.168.0/24
  • /home – Acesso de leitura e escrita para todas máquinas que estão na rede 192.168.0.0/24

Agora vamos inserir as informações no arquivo /etc/exports:

# vim /etc/exports
/data/backup    192.168.0.254(rw,sync,no_subtree_check)
/data/homolog    *.nixi.org(rw,sync,no_subtree_check)
/data/reports    192.168.0.0/24(ro,async,no_subtree_check)
/home        192.168.0.0/24(rw,sync,no_subtree_check)

Após realizar as configurações, é necessário iniciar o serviço na seguinte ordem:

  1. portmap – Primeiro a ser iniciado porque o NFS não possui uma porta padrão e será ele que irá receber as solicitações dos clientes e redirecioná-las.
  2. nfs-kernel-server – Serviço NFS

Iniciando o serviço:

# /etc/init.d/portmap stop

# /etc/init.d/portmap start

# /etc/init.d/nfs-kernel-server stop

# /etc/init.d/nfs-kernel-server start

Checando se o serviço subiu corretamente:

# rpcinfo -p localhost
program vers proto   port
100000    2   tcp    111  portmapper
100024    1   udp  59202  status
100024    1   tcp  56870  status
100000    2   udp    111  portmapper
100021    1   udp  54393  nlockmgr
100021    3   udp  54393  nlockmgr
100021    4   udp  54393  nlockmgr
100021    1   tcp  60789  nlockmgr
100021    3   tcp  60789  nlockmgr
100021    4   tcp  60789  nlockmgr
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs

Nota: O portmap O NFS é registrado através do portmap com o código 100003. Para mais informações sobre códigos que o portmap utiliza, consultar:

# cat /etc/rpc

# man 5 rpc

Com o serviço no ar, criar os diretórios que serão exportados para o cliente:

# mkdir -p /data/{backup,homolog,reports}

Configuração do Cliente

A configuração do cliente, é feita através da instalação do pacote nfs-common:

# apt-get install nfs-common

Após instalar, checar os diretórios compartilhados no servidor:

# showmount -e 192.168.0.104
Export list for 192.168.0.104:
/data/homolog *.nixi.org
/home         192.168.0.0/24
/data/reports 192.168.0.0/24
/data/backup  192.168.0.254

Vamos criar os pontos de montagem dos diretórios no cliente:

# mkdir -p /srv/nfs/{homolog,reports,home,backup}

Montando o diretório compartilhado:

# mount -t nfs 192.168.0.104:/data/homolog /srv/nfs/homolog

Checando o compartilhamento montado:

# showmount -a 192.168.0.104
All mount points on 192.168.0.104:
192.168.0.103:/data/homolog

Também podemos usar o comando mount para visualizar os pontos de montagem:

# mount
192.168.0.104:/data/homolog on /srv/nfs/homolog type nfs (rw,addr=192.168.0.104)

Acima, montamos o compartilhamento via linha de comando. Porém, ao reiniciar a máquina, essa configuração será perdida, o que não é ideal para o nosso cenário.

Para que diretórios remotos fiquem disponíveis no boot, é necessário editar o arquivo /etc/fstab e inserir as seguintes entradas:

# vim /etc/fstab
192.168.0.104:/data/homolog /srv/nfs/homolog  nfs defaults  0 0
192.168.0.104:/home /srv/nfs/home  nfs defaults  0 0
192.168.0.104:/data/reports /srv/nfs/reports  nfs defaults  0 0
192.168.0.104:/data/backup /srv/nfs/backup  nfs defaults  0 0

Lembrando que no cenário, o diretório /data/backup deverá ser montado somente pela máquina com IP 192.168.0.254, conforme definido no arquivo /etc/exports do servidor.

Comandos interesssantes

O comando exportfs é usado para manter a tabela dos sistemas de arquivos exportados via NFS. Essa tabela é armazenada no arquivo /var/lib/nfs/etab que é lido pelo daemon mountd quando um cliente solicita acesso para montar o sistema de arquivos exportado.

Algumas opções:

✔ Exportar todos os diretórios compartilhados – ao acrescentar novo diretório, não é necessário reiniciar o serviço NFS, basta utilizar o comando abaixo:

# exportfs -a -r

✔ Remover um compartilhamento sem parar o NFS:

# exportfs -u *:/mnt/public

O comando nfsstat exibe várias informações de estatística sobre o NFS.

✔ Processos do servidor NFS:

# nfsstat -s

✔ Operações relativas à cliente:

# nfsstat -c

O comando netstat também pode produzir estatísticas de rede, que podem ser utilizadas para verificar se há pacotes perdidos, fragmentos e outras coisas que podem afetar o desempenho do NFS na rede:

# netstat -s

Para conhecer mais sobre os comandos mencionados:

# man exportfs

# man nfsstat

# man netstat

Conclusão

Bem, esse post foi resultado de muitas leituras e anotações que fiz ao montar um servidor NFS, onde foi possível relembrar e aprender mais sobre esse serviço.

Entre os benefícios que o NFS oferece, podemos destacar:

  • Estações locais usam menos espaço em disco porque dados frequentemente usados podem ser armazenados em uma única máquina e ainda permanecerem acessíveis a outras pela rede.
  • Não há necessidade de usuários terem diretórios pessoais separados em cada máquina da rede pois podem podem ser configurados no servidor NFS e serem disponibilizados através da rede.

O cenário utilizado foi para uma pequena empresa que buscou uma alternativa mais em conta para criar seu servidor de arquivos, porém existem outras soluções como NAS – Network-Attached Server. Ter um servidor de arquivos dedicado oferecem vantagens como fácil administração, melhores recursos de backup e verificação.

Mas ao escolher uma solução, sempre levar em conta o ambiente e a necessidade do serviço. Alguns exemplos de servidores de arquivos dedicados:

Nesse post, não entrei na parte de segurança do NFS, porém como outros serviços, esse é um item que deve ser observado. Na web encontramos diversos materiais sobre como fazer isso, porém selecionei alguns que podem servir como ponto de partida:

NFS Security
http://www.linuxsecurity.com/content/view/117705/49/

Segurança e NFS
http://www.linuxinfor.com/portuguese/NFS/nfs.howto.pt_BR-636.html

Protegendo o NFS
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-pt_br-4/s1-server-nfs.html

É isso aí, até o próximo post 🙂 !

Referências

Manual Completo do Linux (Guia do Administrador)
Autor: Evi Nemeth, Garth Snyder, Trent R. Hein – Editora: Pearson Books

Projeto NFS
http://nfs.sourceforge.net/

Quick HOWTO : Ch29 : Remote Disk Access with NFS
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch29_:_Remote_Disk_Access_with_NFS

http://www.linuxinfor.com/portuguese/NFS/nfs.howto.pt_BR-636.html

Configurando quota em disco no Linux – p3

No post anterior, nós habilitamos o suporte a quota no /etc/fstab e criamos os arquivos para gerenciamento das quotas. Agora, vamos fazer a instalação do pacote… mas antes de instalar, primeiro vamos checar se o pacote quota não está instalado:

# dpkg -l | grep -i quota

Caso o comando acima não retorne nada, podemos instalar o pacote:

# apt-get install quota
Lendo listas de pacotes… Pronto
Construindo árvore de dependências
Lendo informação de estado… Pronto
Pacotes sugeridos:
libnet-ldap-perl
Os NOVOS pacotes a seguir serão instalados:
quota
0 pacotes atualizados, 1 pacotes novos instalados, 0 a serem removidos e 34 não atualizados.
É preciso baixar 492kB de arquivos.
Depois desta operação, 1327kB adicionais de espaço em disco serão usados.
Obter:1 http://ftp.debian.org stable/main quota 3.16-7 [492kB]
Baixados 492kB em 13s (37,3kB/s)
Pré-configurando pacotes …
Selecionando pacote previamente não selecionado quota.
(Lendo banco de dados … 53343 arquivos e diretórios atualmente instalados).
Desempacotando quota (de …/archives/quota_3.16-7_i386.deb) …
Processando gatilhos para man-db …
Configurando quota (3.16-7) …

Pacote instalado, vamos levantar o módulo referente a versão de quota que desejamos utilizar. Para isso, vamos no diretório do módulos:

# cd /lib/modules/$(uname -r)/kernel/fs/

No comando acima, substituí a versão do kernel por uma variável; o bash é inteligente para interpretar o que tem dentro dos parênteses e me deixar dentro do diretório do kernel que estou usando no momento!

Ahnn, já falei sobre módulos aqui no blog também. Para relembrar sobre eles, leia o post aqui.

Vamos ver o conteúdo desse diretório:

# pwd
/lib/modules/2.6.26-2-686/kernel/fs

# ls
9p    autofs   binfmt_aout.ko  configfs  efs       ext4      gfs2     isofs  jfs         msdos       nfsd   qnx4         romfs  vfat
adfs  autofs4  binfmt_misc.ko  cramfs    exportfs  fat       hfs      jbd    lockd       ncpfs       nls    quota_v1.ko  sysv   xfs
affs  befs     cifs            dlm       ext2      freevxfs  hfsplus  jbd2   mbcache.ko  nfs         ntfs   quota_v2.ko  udf
afs   bfs      coda            ecryptfs  ext3      fuse      hpfs     jffs2  minix       nfs_common  ocfs2  reiserfs     ufs

Se observarem, acima temos todos módulos para todos filesystems (fs) suportados nessa versão de kernel, incluindo as versões de quota.

Já decidimos que iremos usar quota_v2; para habilitar, basta usar o comando modprobe com o nome do módulo sem a extensão .ko:

# modprobe quota_v2

Checando se o módulo foi habilitado:

# lsmod | grep quota
quota_v2                7968  0

Após o módulo estar no ar, temos que remontar a partição onde aplicamos quota. Isso é necessário pois somente editamos o arquivo /etc/fstab; se não remontarmos a partição, a implementação só fica disponível no próximo reboot. Como temos a sorte de usar um sistema que não precisa reiniciar a cada comando executado, vamos remontar a partição…

E aqui fica um lembrete: não remonte a partição houver pessoas utilizando :D. Para remontar a partição:

# mount -o remount,rw /dev/sda6

Não estou bem lembrada, mas acho que caiu uma pergunta sobre remount na LPI também… fica aí a dica para quem estiver estudando, estudar sobre o comando mount e suas opções de montagem 😉 !

Após o comando acima, podemos checar se o suporte a quota está habilitado na partição; vamos usar de novo o comando mount:

# mount
/dev/sda6 on /home type ext3 (rw,usrquota,grpquota)

Pela saída do comando mount, o suporte foi habilitado com sucesso. Mas para ter certeza, também podemos usar o comando quotacheck, que é um utilitário para checar, criar e reparar arquivos de quota:

# quotacheck -acugv
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sda6 [/home] done
quotacheck: Checked 8 directories and 23 files

Falando sobre as opções do quotacheck e a saída do comando acima:

a => checar todos sistemas de arquivos que tem quota habilitada.
c => criar novos arquivos de gerenciamento de quota.
u => checa os arquivos dos usuários.
g => checa os arquivos dos grupos.
v => modo falante :D; isto é… verbose para mostrar mais detalhes. Os detalhes indicam qual o diretório que foi aplicado quota e também a quantidade de arquivos e diretórios existentes na partição.

Quando executei o comando quotacheck, apareceu o seguinte warning (aviso):

quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.

Isso não chega ser um erro, a quota que você definir para os usuários vai funcionar normalmente. “Mas”, é um aviso que não deve ser ignorado, pois está dizendo que o kernel provavelmente tem suporte a quota em journal, mas isso não está sendo usado e que é bacana considerar mudar para quota journal para evitar rodar o quotacheck depois que o sistema desligou inadequadamente.

Mas o que ser isso, Nix!!!! Vamos la decifrar essa mensagem. Na verdade, estamos usando o filesystem ext3 que tem suporte a journaling. O journaling, nada mais é do que uma técnica implementada no filesystem onde, caso haja queda de energia, a checagem de erros na partição é feita mais rapidamente.

Sendo assim, apenas precisamos habilitar o journaling para as quotas também… e não é difícil!  Para isso, vamos editar o fstab para incluir as opções usrjquota (para usuário) e grpjquota (para grupo). Diferença para as opções que já estão no arquivo:

✔ Vamos colocar um j, para indicar journaling, e também falar os nomes dos arquivos aquota.user e aquota.group

✔ Também precisamos especificar que o formato de quota utilizado é quota_v2, com a opção jqfmt (journaling quota format) usando o valor vfsv0.

Atualmente nosso /etc/fstab está assim:

# vim /etc/fstab
/dev/sda6       /home           ext3    defaults,usrquota,grpquota        0       2

Vamos fazer a alteração e a linha acima deve ficar assim:

/dev/sda6 /home ext3 defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 2

Checando se realmente o que fizemos vai funcionar… vamos executar de novo o quotacheck:

# quotacheck -acugv
quotacheck: Scanning /dev/sda6 [/home] done
quotacheck: Checked 8 directories and 23 files

Opa! Sem warning 😀 ! Vamos finalmente definir quota para os usuários no próximo post! Até lá! 🙂

Configurando quota em disco no Linux – p2

Para entender melhor a questão de quotas, vamos ver as figuras abaixo. Na primeira, temos o hd particionado, mas sem o sistema de quotas. Separamos tudo, até a partição /home, pois sabemos que quanto maior for o espaço, mais os usuário vão querer gravar coisas:

HD particionado

Até aqui, tudo como manda o figurino… Mas o nosso HD está apenas particionado, então vejam como está o /home:

/home sem quotaBem… na figura acima, o home esta uma folia so. Usuários podem gravar eternamente ate o espaço da partição acabar. Mas isso não e bom… imagine se a Familia grava um arquivo que ocupe a partição inteira? Imediatamente a Nix, a Vana e o Nene vão ficar sem espaço para escrever nada…

Entra aí, então as quotas, para organizar as coisas e fazer com que cada usuário grave até o limite permitido. O desenho que ilustra é basicamente o mesmo, o que muda agora, é que cada usuário tem sua ‘caixinha’, isto é, tem o seu espaço em disco reservado para gravar… e não vai impedir que outro usuário grave também, pois o limite dele é a quota que vamos implementar. Vejam:

/home com quota

Colocando a mão na massa

Definimos a partição, vamos editar o arquivo /etc/fstab que contém as tabelas de partições e falar que a partir de agora ele terá quota!

Eu ja falei sobre o fstab aqui no blog, é uma boa idéia dar uma lida no post pra entender como ele é organizado antes de editar ele 😉 !

Só que antes de editar o arquivo, vamos ter aquele cuidado em fazer uma cópia de segurança… eu já tenho o meu diretório de backup que fica no meu /root/backup:

# cd /root/backup/

# cp /etc/fstab fstab.original

# ls -l fstab.original
-rw-r–r– 1 root root 521 Out 23 19:14 fstab.original

Cópia feita, vamos editar o arquivo:

# vim /etc/fstab

A linha do /home atualmente está assim:

/dev/sda6       /home           ext3    defaults        0       2

Acima, a opção de montagem do /home e a defaults que engloba as opções rw, suid, dev, exec, auto, nouser, e async. Vamos acrescentar duas opções, usrquota (para usuário) e grpquota (para grupo):

/dev/sda6  /home  ext3    defaults,usrquota,grpquota        0  2

E é vírgula ( , ) depois da opção defaults e não pode ter espaços entre as opções 😉 .

Depois de habilitarmos o suporte, vamos criar os arquivos de gerenciamento de quota. Como são arquivos que o próprio quota irá gerenciar, podemos criá-los usando o comando touch.

Os arquivos devem ser criados no diretório da partição que será aplicada quota; no nosso caso, o /home:

# cd /home/

# touch aquota.user aquota.group

Após criar os arquivos, mudamos a permissão para leitura somente para o root:

# chmod 600 aquota.*

# ls -l aquota.*
-rw——- 1 root root 0 Out 24 04:42 aquota.group
-rw——- 1 root root 0 Out 24 04:42 aquota.user

Suporte habilitado, arquivos criados… no próximo post, vou falar sobre a instalação do pacote quota e a configuração.

Até lá 🙂 !