Por que cp --reflink = auto não é o comportamento padrão?


31

Por que cp --reflink=autonão é o comportamento padrão? Poderia causar algum dano para ativá-lo?

É possível habilitá-lo em tempo de compilação, para que seja usado em todo o sistema, não apenas em shells interativos?


4
Sim, boa pergunta. IMHO será, pois apenas o BTRFS começa a ser um sistema de arquivos padrão do Linux.
Adam Ryczkowski

Respostas:


38

Não é o padrão, pois, por motivos de robustez, é possível que ocorra uma cópia para proteger contra corrupção de dados. Também por motivos de desempenho, convém que as gravações ocorram no momento da cópia, em vez de algum processo sensível à latência, trabalhando em um arquivo CoW e sendo atrasado pelas gravações, possivelmente em uma parte diferente de um disco mecânico. Observe que a partir do coreutils v8.24 mv irá refletir por padrão, pois não possui as restrições acima.


8
(isso pode ser considerado uma resposta oficial, já que Pádraig é um mantenedor dos coreutils do GNU).
Stéphane Chazelas

8
Duvido que esta resposta esteja correta, pelo menos no btrfs. Se o arquivo for gravado posteriormente, os novos dados serão gravados em um setor de disco diferente de qualquer maneira devido ao btrfs CoW, portanto, não há vantagem de latência em não fazer reflinks. Arquivos que possuem NoDataCoW definido não podem ser refletidos novamente. E se você quiser se proteger contra a corrupção de dados, precisará copiar para uma partição diferente e os reflinks também não funcionarão.
JanKanis

3
Existem problemas de latência, pois o BTRFS precisa encontrar e alocar espaço no momento da gravação. Isso pode até não estar disponível, gerando erros do ENOSPC no momento da gravação
Pádraig Brady

11
Qual a utilidade do mv para o reflink?
Macil

11
subvolume cruz renomeia em btrfs
Pádraig Brady

17

Não sei por que não é o padrão, talvez para que ele se comporta o mesmo que outros utilitários de cópia ( rsync, cpio, pax, tar...) que não têm suporte para ele (ou quando os arquivos são copiados através de uma interface que não permite que (como NFS, samba, camadas de sistemas de arquivos com fusíveis ...).

Eu estava na mesma situação há alguns anos e, olhando o código GNU cp rapidamente, ainda é o mesmo, você precisa corrigir o código para obter um comportamento padrão diferente:

--- coreutils-8.21/src/cp.c~    2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c     2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
   x->interactive = I_UNSPECIFIED;
   x->move_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;

   x->preserve_ownership = false;
   x->preserve_links = false;

4

Um grande problema é o potencial de ficar sem espaço para fazer a cópia quando você escreve.

Com uma cópia normal, assim que a cópia for concluída, você nunca precisará se preocupar com a falha na gravação de partes existentes do arquivo: o espaço é totalmente alocado e não desaparece até que você exclua o arquivo. Mas com uma cópia reflink, sempre existe o risco de que, em algum momento semanas ou meses adiante, uma gravação em uma parte existente do arquivo falhe porque não havia espaço suficiente para fazer uma cópia.

Descobrir que seu sistema estava fazendo cópias de refluxo nas suas costas quando uma operação como essa falhou seria uma surpresa bastante desagradável.


Pelo menos em btrfs mesmo escrever a parte já alocado do arquivo pode falhar com ENOSPC ...
GrayWolf

2
alias cp='cp --reflink=auto --sparse=always'

faz mais sentido do que corrigir o código


6
Parece que você ignorou o artigo É possível ativá-lo em tempo de compilação, para que seja usado em todo o sistema, não apenas em shells interativos na pergunta do OP.
Stéphane Chazelas 26/09

5
@StephaneChazelas Pode-se sempre renomear /bin/cpe substituí-lo com um shell script semelhante
goncalopp

0
  1. Razões de robustez que uma pessoa pode querer que uma cópia ocorra para proteger contra a "perda" de dados.

    Não sabemos o motivo, mas as coisas ruins que podem acontecer estão limitadas à destruição da mídia. A maioria dos dispositivos de bloco possui alguma forma de identificação de corrupção (CRC), se não encaminhar a correção de erros (paridade).

  2. Não por razões de desempenho.

    CoW acontece quando apenas parte do? Apaga? bloco é gravado em. Com o moderno! Disk! dispositivo, o tamanho do bloco de hardware é múltiplo de 4k. Alterar parte do 4k faz com que a unidade leia todo o 4k e escreva-o novamente, mas além disso o kernel fará a mesma coisa, para que não haja gravações parciais atingindo o dispositivo de bloco, SSD ou outro . O kernel precisa executar o CoW pelos mesmos motivos, a menos que tenhamos uma cópia em cache, não podemos compor os dados que existem nas outras partes do dispositivo, exceto no final do conto de um arquivo, mas o ponto é discutível. Mas armazenar em cache uma cópia de um arquivo e copiá-lo são operações diferentes, o primeiro é muito mais barato.

    O endereço da redação é irrelevante, mas saiba que "uma parte não utilizada do dispositivo" é mais barata de descobrir do que "onde residem atualmente os blocos do arquivo".

O fato é que qualquer método CoW é mais barato ou igual a simplesmente atualizar um dispositivo de bloco. Agora, se não estivéssemos falando de dispositivos de bloco, seria outra história ... Escrita em fita em algum lugar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.