Zfs: ZFS рдкрд░ renameat2/overlayfs рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг Docker рдмрд┐рд▓реНрдб рдкреНрд░рджрд░реНрд╢рди рдмреЗрд╣рдж рдзреАрдорд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: openzfs/zfs

рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрд╛рдирдХрд╛рд░реА


рдкреНрд░рдХрд╛рд░ | рд╕рдВрд╕реНрдХрд░рдг/рдирд╛рдо
--- | ---
рд╡рд┐рддрд░рдг рдХрд╛ рдирд╛рдо | рдХреЛрдИ рднреА
рд╡рд┐рддрд░рдг рд╕рдВрд╕реНрдХрд░рдг | рдХреЛрдИ рднреА
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ | рдХреЛрдИ рднреА
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ | рдХреЛрдИ рднреА
рдЬреЗрдбрдПрдлрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг | рдХреЛрдИ рднреА
рдПрд╕рдкреАрдПрд▓ рд╕рдВрд╕реНрдХрд░рдг | рдХреЛрдИ рднреА

рдЖрдк рдЬреЛ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ

рдпрд╣ рдПрдХ рдмрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ docker рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдБ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ ZFS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ ZFS рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИред

рдПрдХ zfs рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк docker рдХрд╛ "zfs рдбреНрд░рд╛рдЗрд╡рд░" рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрддрд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП zfs рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЬреИрд╕реЗ рдХрд┐ ext4 рдФрд░ btrfs рдкрд░, "рдУрд╡рд░рд▓реЗ2 рдбреНрд░рд╛рдЗрд╡рд░" (рдХрд░реНрдиреЗрд▓ рдХреЗ рдУрд╡рд░рд▓реЗрдлреНрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдбреЙрдХрд░ рдмрд┐рд▓реНрдб рд╕рдордп рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрд╢ рд╕реЗ ext4/overlay2 рдкрд░ zfs/zfs рдкрд░ рдХрдИ рдорд┐рдирдЯ рддрдХ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

overlay2 рдбреНрд░рд╛рдЗрд╡рд░ рдЪрдпрди рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ docker рджреНрд╡рд╛рд░рд╛ zfs рдкрд░ рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
https://github.com/moby/moby/blob/master/daemon/graphdriver/overlay2/overlay.go#L165

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ btrfs рдиреЗ рдХрд░реНрдиреЗрд▓ 4.7 рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рд╣реИ:
https://github.com/moby/moby/blob/master/daemon/graphdriver/overlay2/overlay.go#L169

рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ:
рдХрдИ рдкрд░рддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдордп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

time docker build . -t date_image

```рдбреЙрдХрд░рдлрд╛рдЗрд▓

date_image рдбреЙрдХрд░рдлрд╛рдЗрд▓

рд╢реБрд░реВреБрдЖрдд рд╕реЗ
рд╕реАрдПрдордбреА [рддрд╛рд░реАрдЦ]
рд╕реАрдПрдордбреА [рддрд╛рд░реАрдЦ]
рд╕реАрдПрдордбреА [рддрд╛рд░реАрдЦ]
рд╕реАрдПрдордбреА [рддрд╛рд░реАрдЦ]
рд╕реАрдПрдордбреА [рддрд╛рд░реАрдЦ]

рдкреНрд░рджрд░реНрд╢рди рдордВрджреА рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдирд╛рдВрдХ рдкрд░рдд рджреЛрд╣рд░рд╛рдПрдВ

From a functional perspective:
```c
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <linux/fs.h>
#include <sys/syscall.h>

int main()
{
  int ret;

  ret = syscall(SYS_renameat2, 0, "/zfs/file1", 0, "/zfs/file2", RENAME_EXCHANGE);
  fprintf(stderr, "renameat2 ret=%d errno=%d\n", ret, errno);
  return ret;
}

RENAME_WHITEOUT рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рднреА рдкрд░реАрдХреНрд╖рдг рджреЛрд╣рд░рд╛рдПрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ RENAME_EXCHANGE рдФрд░ RENAME_WHITEOUT рджреЛрдиреЛрдВ рдХреЛ renameat2() рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ ZFS w/overlay2 рдкрд░ docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдБ, рдореИрдВ рдЕрдВрдд рдореЗрдВ ZFS рд░реЛрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╣реВрдБ, #9600 рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ ... рдореБрдЭреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рджрд┐рди рджреЗрдВ :)

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдУрд╡рд░рд▓реЗрдлреНрд╕-рдСрди-рдЬреЗрдбрдПрдлрдПрд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП renameat2(2) рдлреНрд▓реИрдЧ рд╕рдкреЛрд░реНрдЯ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ ZFS d_revalidate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ overlayfs рдЗрд╕реЗ рдПрдХ рдЕрдкрд░рджрд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (#8667 рдХреЗ рдЕрд▓рд╛рд╡рд╛) рд╣рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП dcache -рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рдВрдЧ рдХреЛрдб рдХреА рдЙрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ d_revalidate рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ "рдмрд╛рд╕реА" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ 90 рджрд┐рдиреЛрдВ рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдмрд╣реБрдд рдмреБрд░рд╛ рд╕реНрдЯреЗрд▓рдмреЛрдЯ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ @snajpa рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рд╣реИред

рд╣рд╛рдБ, рдореИрдВ рдЕрдВрдд рдореЗрдВ ZFS рд░реЛрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╣реВрдБ, #9600 рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ ... рдореБрдЭреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рджрд┐рди рджреЗрдВ :)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕