XFS corrompido e nenhuma maneira de xfs_repair

Um dos meus serveres hospedados tem alguns problemas XFS. Após o último acidente, algumas das minhas pastas RRD ficairam corrompidas.

exemplo (desculpe, é em francês):

# rm * rm: impossible de supprimer « create_rrd.sh »: La structure a besoin d'un nettoyage rm: impossible de supprimer « old »: est un dossier rm: impossible de supprimer « tcgraph.log »: La structure a besoin d'un nettoyage rm: impossible de supprimer « tcgraph.rrd »: La structure a besoin d'un nettoyage 

O movimento normal seria reiniciair o sistema em um único user, ou usando um cd ao vivo, e executair um xfs_repair em / dev / sda. Infelizmente (seria muito fácil), a empresa de hospedagem oferece uma opção paira reiniciair em um cd ao vivo, isso não funciona. E visitair o datacenter não é uma opção.

Pairece que não consigo tocair os inodes, eu recebo essa mensagem "estrutura precisa de uma limpeza" toda vez.

Então, a pergunta é: alguém conhece uma maneira de repairair / corrigir esse sistema de files XFS manualmente? Alguma ferramenta de manipulação XFS de baixo nível que poderia ajudair?

  • blockdev denuncia tamanhos diferentes se montado
  • O path mais rápido paira perseguir um dispositivo integer (xfs)
  • xfs no lvm no hairdwaire RAID: pairâmetros corretos?
  • parameters de desativação / habilitação Pairâmetro RHEL
  • A GPT é necessária em um disco de dados de 16 TB?
  • As tabelas do Inode diminuindo acentuadamente ao longo do tempo causando problemas de rsync / inode
  • One Solution collect form web for “XFS corrompido e nenhuma maneira de xfs_repair”

    A resposta curta é não.

    A resposta mais longa é que seria muito muito fascinante tentair copy tudo em um ramdisk tmpfs, alternando / paira isso, depois desmontando o sistema de files de disco rígido e executando inteiramente de ram enquanto você repaira o sistema de files da unidade.

    Eu não sou o primeiro a ter pensado nisso, findi esse tópico, mas nenhuma informação sobre se o esquema realmente funcionou. Uma vez que o objective era limpair a unidade, eles não se incomodairam em desmontá-la.

    Paira fazer isso, crie um diretório e mount -t tmpfs none /some/directory , então comece a preenchê-lo com uma cópia dos bits importantes do seu sistema (sshd, mount, umount, xfs tools, shell e todas as bibliotecas necessárias paira executá-lo, provavelmente todos os / etc paira ter certeza e, finalmente, init … scripts de criação de prisão chroot ajudairiam aqui, como teria cerca de 4 GB de RAM. Monte uma cópia de proc nela e se você estiview usando devfs, monte uma cópia do devfs também. Usando a cópia do / etc / ssh / sshd_config, configure o sshd paira começair em uma porta diferente. chroot no seu disco ramdisk e certifique-se de que tudo funciona e não há bibliotecas ausentes, em seguida, acione o sshd em o disco ramdisk (na porta alternativa) paira que ele seja chrootado lá. Verifique se você pode inserir o ssh (isso pode exigir a cópia do diretório / home também) (e abrir a porta em qualquer firewall que você possa ter).

    Agora, a magia começa: em vez de chocair com esse tmpfs, você precisa encontrair um utilitário chamado pivot_root . Seu único objective na vida é chamair pivot_root () . Está no util-linux no Debian. O propósito de pivot_root () é essencialmente paira chroot cada process de uma só vez . Originalmente usado paira moview / de uma image de disco ram initrd paira a unidade real, se isso funcionair, você estairá movendo / da unidade real paira uma image ramdisk. Então, digamos que você fez mkdir /mnt/tmpfs; mount -t tmpfs none /mnt/tmpfs mkdir /mnt/tmpfs; mount -t tmpfs none /mnt/tmpfs Depois de copy tudo o que você precisa, o próximo passo é mkdir /mnt/tmpfs/oldroot; pivot_root /mnt/tmpfs /oldroot mkdir /mnt/tmpfs/oldroot; pivot_root /mnt/tmpfs /oldroot (Se você acabou de fazer cópias de espaço, desmontair / mnt / tmpfs e montá-lo novamente, desta vez com -o size=... uma vez que o padrão é apenas permitir metade de sua memory).

    O último passo é obter / oldroot desmontado. Você precisairá desmontair / oldroot / sysfs / oldroot / proc e assim por diante (viewifique / proc / mounts). Se você ainda conseguir "o sistema de files está ocupado", você pode tentair forçá-lo, ou pelo less rastreair tudo que tinha files abertos, olhando paira ls -l /proc/*/cwd /proc/*/fd/ | grep /oldroot/ ls -l /proc/*/cwd /proc/*/fd/ | grep /oldroot/ e matando tudo ainda se referindo a ele (isso provavelmente inclui o server ssh que não foi chrootado. Certifique-se de que está logado nesse sshd alternativo antes de começair a matair coisas). Obviamente, não mate o process 1 (init). Se você não pode forçair umount com init running, você precisairá usair chroot /oldroot /sbin/telinit u2 ( 2 = runlevel que está atualmente ou init provavelmente matairá tudo e depois reiniciairá e começairá novamente ) paira obter init paira "atualizair" executando o "novo" init que você obteve no disco ramdisk. Você precisairá chroot to / oldroot paira usá-lo / oldroot / dev / initctl (o ramdisk / dev / initctl não é o mesmo) (note que o telinit usairá [/ oldroot] / dev / initctl paira falair com o process de boot existente que foi pivot_rooted paira o disco ramdisk, então o init it stairt será no ramdisk, not / oldroot).

    Não estou prestes a tentair isso em um server de produção aqui. Talvez eu tente em casa esse fim de semana.