getch 0.0.5 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +30 -0
  5. data/README.md +31 -6
  6. data/bin/setup.sh +29 -13
  7. data/lib/getch.rb +43 -30
  8. data/lib/getch/command.rb +163 -0
  9. data/lib/getch/filesystem.rb +8 -0
  10. data/lib/getch/filesystem/ext4.rb +14 -0
  11. data/lib/getch/filesystem/ext4/config.rb +59 -0
  12. data/lib/getch/filesystem/ext4/deps.rb +22 -0
  13. data/lib/getch/filesystem/ext4/device.rb +16 -0
  14. data/lib/getch/filesystem/ext4/encrypt.rb +15 -0
  15. data/lib/getch/filesystem/ext4/encrypt/config.rb +85 -0
  16. data/lib/getch/filesystem/ext4/encrypt/deps.rb +59 -0
  17. data/lib/getch/filesystem/ext4/encrypt/device.rb +21 -0
  18. data/lib/getch/filesystem/ext4/encrypt/format.rb +32 -0
  19. data/lib/getch/filesystem/ext4/encrypt/mount.rb +64 -0
  20. data/lib/getch/filesystem/ext4/encrypt/partition.rb +116 -0
  21. data/lib/getch/filesystem/ext4/format.rb +30 -0
  22. data/lib/getch/filesystem/ext4/mount.rb +62 -0
  23. data/lib/getch/filesystem/ext4/partition.rb +75 -0
  24. data/lib/getch/filesystem/lvm.rb +14 -0
  25. data/lib/getch/filesystem/lvm/config.rb +63 -0
  26. data/lib/getch/filesystem/lvm/deps.rb +57 -0
  27. data/lib/getch/filesystem/lvm/device.rb +19 -0
  28. data/lib/getch/filesystem/lvm/encrypt.rb +15 -0
  29. data/lib/getch/filesystem/lvm/encrypt/config.rb +74 -0
  30. data/lib/getch/filesystem/lvm/encrypt/deps.rb +63 -0
  31. data/lib/getch/filesystem/lvm/encrypt/device.rb +22 -0
  32. data/lib/getch/filesystem/lvm/encrypt/format.rb +32 -0
  33. data/lib/getch/filesystem/lvm/encrypt/mount.rb +64 -0
  34. data/lib/getch/filesystem/lvm/encrypt/partition.rb +92 -0
  35. data/lib/getch/filesystem/lvm/format.rb +25 -0
  36. data/lib/getch/filesystem/lvm/mount.rb +62 -0
  37. data/lib/getch/filesystem/lvm/partition.rb +81 -0
  38. data/lib/getch/filesystem/zfs.rb +14 -0
  39. data/lib/getch/filesystem/zfs/config.rb +58 -0
  40. data/lib/getch/filesystem/zfs/deps.rb +90 -0
  41. data/lib/getch/filesystem/zfs/device.rb +19 -0
  42. data/lib/getch/filesystem/zfs/encrypt.rb +15 -0
  43. data/lib/getch/filesystem/zfs/encrypt/config.rb +67 -0
  44. data/lib/getch/filesystem/zfs/encrypt/deps.rb +94 -0
  45. data/lib/getch/filesystem/zfs/encrypt/device.rb +21 -0
  46. data/lib/getch/filesystem/zfs/encrypt/format.rb +22 -0
  47. data/lib/getch/filesystem/zfs/encrypt/mount.rb +67 -0
  48. data/lib/getch/filesystem/zfs/encrypt/partition.rb +151 -0
  49. data/lib/getch/filesystem/zfs/format.rb +20 -0
  50. data/lib/getch/filesystem/zfs/mount.rb +67 -0
  51. data/lib/getch/filesystem/zfs/partition.rb +147 -0
  52. data/lib/getch/gentoo.rb +3 -2
  53. data/lib/getch/gentoo/boot.rb +29 -25
  54. data/lib/getch/gentoo/chroot.rb +18 -14
  55. data/lib/getch/gentoo/config.rb +18 -9
  56. data/lib/getch/gentoo/sources.rb +45 -31
  57. data/lib/getch/gentoo/stage.rb +2 -2
  58. data/lib/getch/helpers.rb +24 -6
  59. data/lib/getch/log.rb +54 -0
  60. data/lib/getch/options.rb +16 -7
  61. data/lib/getch/version.rb +1 -1
  62. metadata +48 -5
  63. metadata.gz.sig +0 -0
  64. data/lib/getch/disk.rb +0 -77
  65. data/lib/getch/mount.rb +0 -73
@@ -0,0 +1,90 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ class Deps < Getch::FileSystem::Zfs::Device
5
+ def initialize
6
+ super
7
+ install_deps
8
+ zfs_mountpoint
9
+ auto_module_rebuild
10
+ end
11
+
12
+ def make
13
+ hostid
14
+ options_make
15
+ Getch::Make.new("genkernel --kernel-config=/usr/src/linux/.config all").run!
16
+ end
17
+
18
+ private
19
+ def install_deps
20
+ exec("euse -E libzfs") if ! Helpers::grep?("#{MOUNTPOINT}/etc/portage/make.conf", /libzfs/)
21
+ exec("euse -E rootfs") if ! Helpers::grep?("#{MOUNTPOINT}/etc/portage/make.conf", /rootfs/)
22
+ Getch::Garden.new('-a zfs').run!
23
+ Getch::Make.new("make modules_prepare").run!
24
+ Getch::Make.new("make -j$(nproc)").run!
25
+ Getch::Emerge.new('genkernel sys-fs/zfs').pkg!
26
+ end
27
+
28
+ # See: https://wiki.archlinux.org/index.php/ZFS#Using_zfs-mount-generator
29
+ def zfs_mountpoint
30
+ Helpers::mkdir("#{MOUNTPOINT}/etc/zfs/zfs-list.cache")
31
+ Helpers::touch("#{MOUNTPOINT}/etc/zfs/zfs-list.cache/#{@boot_pool_name}") if @dev_boot
32
+ Helpers::touch("#{MOUNTPOINT}/etc/zfs/zfs-list.cache/#{@pool_name}")
33
+ exec("ln -fs /usr/libexec/zfs/zed.d/history_event-zfs-list-cacher.sh /etc/zfs/zed.d/")
34
+ exec("systemctl start zfs-zed.service")
35
+ Helpers::sys("sed -Ei \"s|/mnt/?|/|\" #{MOUNTPOINT}/etc/zfs/zfs-list.cache/*")
36
+ exec("systemctl enable zfs-zed.service")
37
+ exec("systemctl enable zfs.target")
38
+ end
39
+
40
+ def auto_module_rebuild
41
+ g_dir="#{MOUNTPOINT}/etc/portage/env/sys-kernel"
42
+ Helpers::mkdir(g_dir)
43
+ # See https://wiki.gentoo.org/wiki/Kernel/Upgrade#Automated_build_and_installation
44
+ content=<<EOF
45
+ post_pkg_postinst() {
46
+ # BUG: reinstalls of a source will cause errors
47
+ CURRENT_KV=$(uname -r)
48
+ # Check to see if genkernel has been run previously for the running kernel and use that config
49
+ if [[ -f "${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" ]] ; then
50
+ genkernel --kernel-config="${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" all
51
+ elif [[ -f "${EROOT}/usr/src/linux-${CURRENT_KV}/.config" ]] ; then # Use latest kernel config from current kernel
52
+ genkernel --kernel-config="${EROOT}/usr/src/linux-${CURRENT_KV}/.config" all
53
+ else # No valid configs known
54
+ genkernel all
55
+ fi
56
+ }
57
+ EOF
58
+ File.write("#{g_dir}/gentoo-sources", content)
59
+ end
60
+
61
+ def hostid
62
+ hostid_value=`hostid`.chomp
63
+ File.write("#{MOUNTPOINT}/etc/hostid", hostid_value, mode: 'w')
64
+ end
65
+
66
+ def options_make
67
+ bootloader = Helpers::efi? ? 'BOOTLOADER="no"' : 'BOOTLOADER="grub2"'
68
+ datas = [
69
+ '',
70
+ bootloader,
71
+ 'INSTALL="yes"',
72
+ 'MENUCONFIG="no"',
73
+ 'CLEAN="yes"',
74
+ 'SAVE_CONFIG="yes"',
75
+ 'MOUNTBOOT="no"',
76
+ 'MRPROPER="no"',
77
+ 'ZFS="yes"',
78
+ 'MODULEREBUILD="yes"'
79
+ ]
80
+ file = "#{MOUNTPOINT}/etc/genkernel.conf"
81
+ File.write(file, datas.join("\n"), mode: 'a')
82
+ end
83
+
84
+ def exec(cmd)
85
+ Getch::Chroot.new(cmd).run!
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,19 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ class Device
5
+ def initialize
6
+ @disk = DEFAULT_OPTIONS[:disk]
7
+ @user = DEFAULT_OPTIONS[:username]
8
+ @dev_boot_efi = Helpers::efi? ? "/dev/#{@disk}1" : nil
9
+ @dev_boot = Helpers::efi? ? nil : "/dev/#{@disk}2"
10
+ @dev_swap = Helpers::efi? ? "/dev/#{@disk}2" : "/dev/#{@disk}3"
11
+ @dev_root = Helpers::efi? ? "/dev/#{@disk}3" : "/dev/#{@disk}4"
12
+ @boot_pool_name = 'bpool'
13
+ @pool_name = 'zpool'
14
+ @zfs_home = @user ? true : false
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'encrypt/device'
11
+ require_relative 'encrypt/partition'
12
+ require_relative 'encrypt/format'
13
+ require_relative 'encrypt/mount'
14
+ require_relative 'encrypt/config'
15
+ require_relative 'encrypt/deps'
@@ -0,0 +1,67 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ class Config < Getch::FileSystem::Zfs::Encrypt::Device
6
+ def initialize
7
+ super
8
+ gen_uuid
9
+ @root_dir = MOUNTPOINT
10
+ @init = '/usr/lib/systemd/systemd'
11
+ crypttab
12
+ end
13
+
14
+ def fstab
15
+ file = "#{@root_dir}/etc/fstab"
16
+ datas = data_fstab
17
+ File.write(file, datas.join("\n"))
18
+ end
19
+
20
+ def systemd_boot
21
+ return if ! Helpers::efi?
22
+ esp = '/boot/efi'
23
+ dir = "#{@root_dir}/#{esp}/loader/entries/"
24
+ datas_gentoo = [
25
+ 'title Gentoo Linux',
26
+ 'linux /vmlinuz',
27
+ 'initrd /initramfs',
28
+ "options root=ZFS=#{@pool_name}/ROOT/gentoo init=#{@init} dozfs keymap=#{DEFAULT_OPTIONS[:keymap]}"
29
+ ]
30
+ File.write("#{dir}/gentoo.conf", datas_gentoo.join("\n"))
31
+ end
32
+
33
+ def crypttab
34
+ datas = [
35
+ "cryptswap UUID=#{@uuid_swap} /dev/urandom swap,cipher=aes-xts-plain64:sha256,size=256"
36
+ ]
37
+ File.write("#{@root_dir}/etc/crypttab", datas.join("\n"))
38
+ end
39
+
40
+ # See https://wiki.gentoo.org/wiki/ZFS#ZFS_root
41
+ def grub
42
+ return if Helpers::efi?
43
+ file = "#{@root_dir}/etc/default/grub"
44
+ cmdline = [
45
+ "GRUB_CMDLINE_LINUX=\"root=ZFS=#{@pool_name}/ROOT/gentoo init=#{@init} dozfs keymap=#{DEFAULT_OPTIONS[:keymap]}\""
46
+ ]
47
+ File.write("#{file}", cmdline.join("\n"), mode: 'a')
48
+ end
49
+
50
+ private
51
+
52
+ def gen_uuid
53
+ @uuid_swap = `lsblk -o "UUID" #{@dev_swap} | tail -1`.chomp()
54
+ @uuid_boot_efi = `lsblk -o "UUID" #{@dev_boot_efi} | tail -1`.chomp() if @dev_boot_efi
55
+ end
56
+
57
+ def data_fstab
58
+ boot_efi = @dev_boot_efi ? "UUID=#{@uuid_boot_efi} /boot/efi vfat noauto,noatime 1 2" : ''
59
+ swap = @dev_swap ? "/dev/mapper/cryptswap none swap discard 0 0" : ''
60
+
61
+ [ boot_efi, swap ]
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,94 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ class Deps < Getch::FileSystem::Zfs::Encrypt::Device
6
+ def initialize
7
+ super
8
+ install_deps
9
+ zfs_mountpoint
10
+ auto_module_rebuild
11
+ end
12
+
13
+ def make
14
+ hostid
15
+ options_make
16
+ Getch::Make.new("genkernel --kernel-config=/usr/src/linux/.config all").run!
17
+ end
18
+
19
+ private
20
+ def install_deps
21
+ exec("euse -E libzfs") if ! Helpers::grep?("#{MOUNTPOINT}/etc/portage/make.conf", /libzfs/)
22
+ exec("euse -E rootfs") if ! Helpers::grep?("#{MOUNTPOINT}/etc/portage/make.conf", /rootfs/)
23
+ exec("euse -E cryptsetup") if ! Helpers::grep?("#{MOUNTPOINT}/etc/portage/make.conf", /cryptsetup/)
24
+ Getch::Garden.new('-a zfs').run!
25
+ Getch::Make.new("make modules_prepare").run!
26
+ Getch::Make.new("make -j$(nproc)").run!
27
+ Getch::Emerge.new('genkernel sys-fs/zfs sys-apps/systemd sys-fs/cryptsetup').pkg!
28
+ end
29
+
30
+ # See: https://wiki.archlinux.org/index.php/ZFS#Using_zfs-mount-generator
31
+ def zfs_mountpoint
32
+ Helpers::mkdir("#{MOUNTPOINT}/etc/zfs/zfs-list.cache")
33
+ Helpers::touch("#{MOUNTPOINT}/etc/zfs/zfs-list.cache/#{@boot_pool_name}") if @dev_boot
34
+ Helpers::touch("#{MOUNTPOINT}/etc/zfs/zfs-list.cache/#{@pool_name}")
35
+ exec("ln -fs /usr/libexec/zfs/zed.d/history_event-zfs-list-cacher.sh /etc/zfs/zed.d/")
36
+ exec("systemctl start zfs-zed.service")
37
+ Helpers::sys("sed -Ei \"s|/mnt/?|/|\" #{MOUNTPOINT}/etc/zfs/zfs-list.cache/*")
38
+ exec("systemctl enable zfs-zed.service")
39
+ exec("systemctl enable zfs.target")
40
+ end
41
+
42
+ def auto_module_rebuild
43
+ g_dir="#{MOUNTPOINT}/etc/portage/env/sys-kernel"
44
+ Helpers::mkdir(g_dir)
45
+ # See https://wiki.gentoo.org/wiki/Kernel/Upgrade#Automated_build_and_installation
46
+ content=<<EOF
47
+ post_pkg_postinst() {
48
+ # BUG: reinstalls of a source will cause errors
49
+ CURRENT_KV=$(uname -r)
50
+ # Check to see if genkernel has been run previously for the running kernel and use that config
51
+ if [[ -f "${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" ]] ; then
52
+ genkernel --kernel-config="${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" all
53
+ elif [[ -f "${EROOT}/usr/src/linux-${CURRENT_KV}/.config" ]] ; then # Use latest kernel config from current kernel
54
+ genkernel --kernel-config="${EROOT}/usr/src/linux-${CURRENT_KV}/.config" all
55
+ else # No valid configs known
56
+ genkernel all
57
+ fi
58
+ }
59
+ EOF
60
+ File.write("#{g_dir}/gentoo-sources", content)
61
+ end
62
+
63
+ def hostid
64
+ hostid_value=`hostid`.chomp
65
+ File.write("#{MOUNTPOINT}/etc/hostid", hostid_value, mode: 'w')
66
+ end
67
+
68
+ def options_make
69
+ bootloader = Helpers::efi? ? 'BOOTLOADER="no"' : 'BOOTLOADER="grub2"'
70
+ datas = [
71
+ '',
72
+ bootloader,
73
+ 'INSTALL="yes"',
74
+ 'MENUCONFIG="no"',
75
+ 'CLEAN="yes"',
76
+ 'KEYMAP="yes"',
77
+ 'SAVE_CONFIG="yes"',
78
+ 'MOUNTBOOT="no"',
79
+ 'MRPROPER="no"',
80
+ 'ZFS="yes"',
81
+ 'MODULEREBUILD="yes"'
82
+ ]
83
+ file = "#{MOUNTPOINT}/etc/genkernel.conf"
84
+ File.write(file, datas.join("\n"), mode: 'a')
85
+ end
86
+
87
+ def exec(cmd)
88
+ Getch::Chroot.new(cmd).run!
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,21 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ class Device
6
+ def initialize
7
+ @disk = DEFAULT_OPTIONS[:disk]
8
+ @user = DEFAULT_OPTIONS[:username]
9
+ @dev_boot_efi = Helpers::efi? ? "/dev/#{@disk}1" : nil
10
+ @dev_boot = Helpers::efi? ? nil : "/dev/#{@disk}2"
11
+ @dev_swap = Helpers::efi? ? "/dev/#{@disk}2" : "/dev/#{@disk}3"
12
+ @dev_root = Helpers::efi? ? "/dev/#{@disk}3" : "/dev/#{@disk}4"
13
+ @boot_pool_name = 'bpool'
14
+ @pool_name = 'zpool'
15
+ @zfs_home = @user ? true : false
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ class Format < Getch::FileSystem::Zfs::Encrypt::Device
6
+ def initialize
7
+ super
8
+ @state = Getch::States.new()
9
+ format
10
+ end
11
+
12
+ def format
13
+ return if STATES[:format]
14
+ system("mkfs.fat -F32 #{@dev_boot_efi}") if @dev_boot_efi
15
+ system("mkswap -f #{@dev_swap}")
16
+ @state.format
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,67 @@
1
+ require 'fileutils'
2
+
3
+ module Getch
4
+ module FileSystem
5
+ module Zfs
6
+ module Encrypt
7
+ class Mount < Getch::FileSystem::Zfs::Encrypt::Device
8
+ def initialize
9
+ super
10
+ @root_dir = MOUNTPOINT
11
+ @boot_dir = "#{@root_dir}/boot"
12
+ @boot_efi_dir = "#{@root_dir}/boot/efi"
13
+ @state = Getch::States.new()
14
+ @log = Getch::Log.new
15
+ end
16
+
17
+ def run
18
+ return if STATES[:mount]
19
+ exec("zpool export -a")
20
+ exec("rm -rf #{MOUNTPOINT}/*")
21
+ exec("zpool import -N -R #{MOUNTPOINT} #{@pool_name}")
22
+ exec("zpool import -N -R #{MOUNTPOINT} #{@boot_pool_name}") if @dev_boot
23
+ exec("zfs load-key -a")
24
+ mount_swap
25
+ mount_root
26
+ mount_boot
27
+ mount_boot_efi
28
+ exec("zfs mount -a")
29
+ @state.mount
30
+ end
31
+
32
+ private
33
+
34
+ def mount_swap
35
+ if Helpers::grep?('/proc/swaps', /^\/dev/)
36
+ exec("swapoff #{@dev_swap}")
37
+ end
38
+
39
+ exec("swapon #{@dev_swap}")
40
+ end
41
+
42
+ def mount_root
43
+ Helpers::mkdir(@root_dir)
44
+ exec("zfs mount #{@pool_name}/ROOT/gentoo")
45
+ end
46
+
47
+ def mount_boot_efi
48
+ return if ! @dev_boot_efi
49
+ Helpers::mkdir(@boot_efi_dir)
50
+ exec("mount #{@dev_boot_efi} #{@boot_efi_dir}")
51
+ end
52
+
53
+ def mount_boot
54
+ return if ! @dev_boot
55
+ Helpers::mkdir(@boot_dir)
56
+ exec("zfs mount #{@boot_pool_name}/BOOT/gentoo")
57
+ end
58
+
59
+ def exec(cmd)
60
+ @log.info("==> #{cmd}")
61
+ Helpers::sys(cmd)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,151 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Zfs
4
+ module Encrypt
5
+ class Partition < Getch::FileSystem::Zfs::Encrypt::Device
6
+ def initialize
7
+ super
8
+ @state = Getch::States.new()
9
+ @log = Getch::Log.new()
10
+ run_partition
11
+ end
12
+
13
+ def run_partition
14
+ return if STATES[:partition ]
15
+ clear_struct
16
+ cleaning
17
+ partition
18
+ zfs
19
+ @state.partition
20
+ end
21
+
22
+ private
23
+
24
+ def clear_struct
25
+ oldvg = `vgdisplay | grep #{@vg}`.chomp
26
+ oldzpool = `zpool status | grep pool:`.gsub(/pool: /, '').delete(' ').split("\n")
27
+ if oldzpool[0] != "" and $?.success?
28
+ oldzpool.each { |p| exec("zpool destroy #{p}") if p }
29
+ end
30
+ exec("vgremove -f #{@vg}") if oldvg != '' # remove older volume group
31
+ exec("pvremove -f #{@dev_root}") if oldvg != '' and File.exist? @dev_root # remove older volume group
32
+
33
+ exec("sgdisk -Z /dev/#{@disk}")
34
+ exec("wipefs -a /dev/#{@disk}")
35
+ end
36
+
37
+ # See https://wiki.archlinux.org/index.php/Solid_state_drive/Memory_cell_clearing
38
+ # for SSD
39
+ def cleaning
40
+ @bloc=`blockdev --getbsz /dev/#{@disk}`.chomp
41
+ puts
42
+ print "Cleaning data on #{@disk}, can be long, avoid this on Flash Memory (SSD,USB,...) ? (n,y) "
43
+ case gets.chomp
44
+ when /^y|^Y/
45
+ exec("dd if=/dev/urandom of=/dev/#{@disk} bs=#{@bloc} status=progress")
46
+ else
47
+ return
48
+ end
49
+ end
50
+
51
+ def partition
52
+ mem=`awk '/MemTotal/ {print $2}' /proc/meminfo`.chomp + 'K'
53
+ if Helpers::efi?
54
+ exec("sgdisk -n1:1M:+260M -t1:EF00 /dev/#{@disk}")
55
+ exec("sgdisk -n2:0:+#{mem} -t2:8200 /dev/#{@disk}")
56
+ exec("sgdisk -n3:0:+0 -t3:BF00 /dev/#{@disk}")
57
+ else
58
+ exec("sgdisk -n1:1MiB:+1MiB -t1:EF02 /dev/#{@disk}")
59
+ exec("sgdisk -n2:0:+2G -t2:BE00 /dev/#{@disk}") # boot pool GRUB
60
+ exec("sgdisk -n3:0:+#{mem} -t3:8200 /dev/#{@disk}")
61
+ exec("sgdisk -n4:0:+0 -t4:BF00 /dev/#{@disk}")
62
+ end
63
+ end
64
+
65
+ def zfs
66
+ ashift = case @bloc
67
+ when 8096
68
+ 13
69
+ when 4096
70
+ 12
71
+ else # 512
72
+ 9
73
+ end
74
+
75
+ Helpers::mkdir(MOUNTPOINT)
76
+
77
+ @log.debug("ashift found for #{@bloc} - #{ashift}")
78
+ if ! Helpers::efi?
79
+ # https://openzfs.github.io/openzfs-docs/Getting%20Started/Ubuntu/Ubuntu%2020.04%20Root%20on%20ZFS.html
80
+ @log.info("Creating boot pool on #{@pool_name}")
81
+ exec("zpool create -f \\
82
+ -o ashift=#{ashift} -d \\
83
+ -o feature@async_destroy=enabled \\
84
+ -o feature@bookmarks=enabled \\
85
+ -o feature@embedded_data=enabled \\
86
+ -o feature@empty_bpobj=enabled \\
87
+ -o feature@enabled_txg=enabled \\
88
+ -o feature@extensible_dataset=enabled \\
89
+ -o feature@filesystem_limits=enabled \\
90
+ -o feature@hole_birth=enabled \\
91
+ -o feature@large_blocks=enabled \\
92
+ -o feature@lz4_compress=enabled \\
93
+ -o feature@spacemap_histogram=enabled \\
94
+ -O acltype=posixacl -O canmount=off -O compression=lz4 \\
95
+ -O devices=off -O normalization=formD -O atime=off -O xattr=sa \\
96
+ -O mountpoint=/boot -R #{MOUNTPOINT} \\
97
+ #{@boot_pool_name} #{@dev_boot}
98
+ ")
99
+ end
100
+
101
+ exec("zpool create -f -o ashift=#{ashift} \\
102
+ -O encryption=aes-256-gcm \\
103
+ -O keylocation=prompt -O keyformat=passphrase \\
104
+ -O acltype=posixacl -O canmount=off -O compression=lz4 \\
105
+ -O dnodesize=auto -O normalization=formD -O atime=off \\
106
+ -O xattr=sa -O mountpoint=/ -R #{MOUNTPOINT} \\
107
+ #{@pool_name} #{@dev_root}
108
+ ")
109
+
110
+ add_datasets
111
+ end
112
+
113
+ def add_datasets
114
+ exec("zfs create -o canmount=off -o mountpoint=none #{@pool_name}/ROOT")
115
+ exec("zfs create -o canmount=off -o mountpoint=none #{@boot_pool_name}/BOOT") if @dev_boot
116
+
117
+ exec("zfs create -o canmount=noauto -o mountpoint=/ #{@pool_name}/ROOT/gentoo")
118
+ # set bootfs
119
+ #exec("zpool set bootfs=#{@pool_name}/ROOT/gentoo #{@pool_name}")
120
+ exec("zfs create -o canmount=noauto -o mountpoint=/boot #{@boot_pool_name}/BOOT/gentoo") if @dev_boot
121
+
122
+ exec("zfs create -o canmount=off #{@pool_name}/ROOT/gentoo/usr")
123
+ exec("zfs create #{@pool_name}/ROOT/gentoo/usr/src")
124
+ exec("zfs create -o canmount=off #{@pool_name}/ROOT/gentoo/var")
125
+ exec("zfs create #{@pool_name}/ROOT/gentoo/var/log")
126
+ exec("zfs create #{@pool_name}/ROOT/gentoo/var/db")
127
+ exec("zfs create #{@pool_name}/ROOT/gentoo/var/tmp")
128
+
129
+ exec("zfs create -o canmount=off -o mountpoint=/ #{@pool_name}/USERDATA")
130
+ exec("zfs create -o canmount=on -o mountpoint=/root #{@pool_name}/USERDATA/root")
131
+ exec("zfs create -o canmount=on -o mountpoint=/home/#{@user} #{@pool_name}/USERDATA/#{@user}") if @user
132
+ end
133
+
134
+ # Follow https://wiki.archlinux.org/index.php/Partitioning
135
+ # Partition_efi
136
+ # /boot/efi - EFI system partition - 260MB
137
+ # / - Root
138
+
139
+ # Partition_bios
140
+ # None - Bios Boot Partition - 1MiB
141
+ # /boot - Boot - 8300
142
+ # / - Root
143
+
144
+ def exec(cmd)
145
+ Helpers::sys(cmd)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end