AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1169886
Accepted
dummzeuch
dummzeuch
Asked: 2025-01-08 16:57:28 +0800 CST2025-01-08 16:57:28 +0800 CST 2025-01-08 16:57:28 +0800 CST

Por que chamar chown e chmod que não altera nada cria diferenças entre snapshots no ZFS?

  • 772

Em nosso servidor, temos um cron job que chama regularmente chowne chmodpara um diretório em um sistema de arquivos ZFS. Normalmente, isso não altera o usuário e os direitos porque o diretório já tem os mesmos atributos.

Há outra tarefa cron que cria regularmente um instantâneo deste sistema de arquivos.

No Natal, eu estava sozinho no escritório, então não deveria ter havido alterações no servidor, mas descobri que os instantâneos do ZFS não estavam vazios.

Os seguintes atributos foram definidos para o pool e o conjunto de dados:

compression=on (lz4)
atime=off
xattr=sa
acltype=posixacl

Por que o instantâneo não está vazio se a chamada chownand chmodnão altera nada?

Existe alguma maneira de evitar isso?

(Não, não posso desabilitar essa tarefa cron.)

linux
  • 2 2 respostas
  • 154 Views

2 respostas

  • Voted
  1. Best Answer
    VagrantPaladin
    2025-01-08T22:06:17+08:002025-01-08T22:06:17+08:00

    A razão pela qual isso está acontecendo é devido a uma combinação de duas coisas.

    1. chmod mente para você quando diz que manteve as permissões como estavam, e
    2. O ZFS é cópia na gravação.

    Ao usar chmod para definir as permissões para o que elas já são (forçando), chmod imprime uma mensagem, mas na verdade ainda executa a chamada para definir o modo alterado no arquivo. Podemos ver isso com strace

    vagrant@kompir ~> strace -o nochange.trace chmod -v 750 file
    mode of 'file' retained as 0750 (rwxr-x---)
    vagrant@kompir ~> grep -v -e ^open -e ^mmap nochange.trace |cat -n
         1  execve("/usr/bin/chmod", ["chmod", "-v", "750", "file"], 0x7ffc100c8218 /* 69 vars */) = 0
         2  brk(NULL)                               = 0x5675850ec000
         3  arch_prctl(0x3001 /* ARCH_??? */, 0x7ffc7c8c4a00) = -1 EINVAL (Invalid argument)
         4  access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
         5  newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=139311, ...}, AT_EMPTY_PATH) = 0
         6  close(3)                                = 0
         7  read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\237\2\0\0\0\0\0"..., 832) = 832
         8  pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
         9  pread64(3, "\4\0\0\0 \0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0"..., 48, 848) = 48
        10  pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0I\17\357\204\3$\f\221\2039x\324\224\323\236S"..., 68, 896) = 68
        11  newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=2220400, ...}, AT_EMPTY_PATH) = 0
        12  pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
        13  mprotect(0x76dcfac28000, 2023424, PROT_NONE) = 0
        14  close(3)                                = 0
        15  arch_prctl(ARCH_SET_FS, 0x76dcfae4e740) = 0
        16  set_tid_address(0x76dcfae4ea10)         = 2718390
        17  set_robust_list(0x76dcfae4ea20, 24)     = 0
        18  rseq(0x76dcfae4f0e0, 0x20, 0, 0x53053053) = 0
        19  mprotect(0x76dcfae16000, 16384, PROT_READ) = 0
        20  mprotect(0x567584d6a000, 4096, PROT_READ) = 0
        21  mprotect(0x76dcfaeae000, 8192, PROT_READ) = 0
        22  prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
        23  munmap(0x76dcfae51000, 139311)          = 0
        24  getrandom("\x4f\xd5\xfe\xb7\x3c\x7d\x8c\xa8", 8, GRND_NONBLOCK) = 8
        25  brk(NULL)                               = 0x5675850ec000
        26  brk(0x56758510d000)                     = 0x56758510d000
        27  newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=5712208, ...}, AT_EMPTY_PATH) = 0
        28  close(3)                                = 0
        29  umask(000)                              = 002
        30  newfstatat(AT_FDCWD, "file", {st_mode=S_IFREG|0750, st_size=0, ...}, 0) = 0
        31  fchmodat(AT_FDCWD, "file", 0750)        = 0
        32  newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=2996, ...}, AT_EMPTY_PATH) = 0
        33  read(3, "# Locale name alias data base.\n#"..., 4096) = 2996
        34  read(3, "", 4096)                       = 0
        35  close(3)                                = 0
        36  newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=613, ...}, AT_EMPTY_PATH) = 0
        37  close(3)                                = 0
        38  newfstatat(1, "", {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0xb), ...}, AT_EMPTY_PATH) = 0
        39  write(1, "mode of 'file' retained as 0750 "..., 44) = 44
        40  close(1)                                = 0
        41  close(2)                                = 0
        42  exit_group(0)                           = ?
        43  +++ exited with 0 +++
    

    Observe na linha 31 acima a chamada para fchmodat(). Isso faz com que o sistema operacional grave novos bits de modo no inode. O ZFS mantém informações do inode como todas as outras informações dentro do zpool, e também é copy-on-write. O bloco é lido, modificado e então gravado de volta no disco, e os metadados são cascateados para o nó raiz.

    Essa é a mudança que fica visível no instantâneo, mesmo que nenhuma mudança real seja necessária.

    Dependendo da implementação real do chmod, isso pode ou não acontecer em outros sistemas operacionais.

    EDIT: Removido o comentário sobre o rastreamento de tempo, pois a pergunta informa que ele já está desabilitado.

    • 5
  2. Zac67
    2025-01-08T20:21:43+08:002025-01-08T20:21:43+08:00

    se a chamada chown e chmod não mudar nada?

    Mas eles fazem. Se você reescrever os valores anteriores, eles ainda serão escritos e a entrada do arquivo será escrita. Isso é uma mudança.

    Para evitar essas alterações "nulas", você precisa ler os valores atuais, compará-los com o estado desejado e escrever somente se uma alteração for necessária.

    Como @paladin destacou, provavelmente existe uma maneira muito melhor de lidar com permissões de arquivo.

    • 4

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve