Dihoskan secara mampan, F/OSS Terurus Penyimpanan objek, Redis, Prometheus pada Hetzner, OVH dan LeaseWeb **tl;dr - Penjelasan baris demi baris tentang skrip pemasangan ZFS saya yang dikuasakan ansible untuk digunakan pada perkakasan khusus Hetzner (Ubuntu 20.04 - âÂÂFocalâÂÂ) â  iaâ tidak sempurna/minimum, tetapi ia berkesan untuk saya Beberapa ketika dahulu, saya mula menggunakan ZFS pada semua perkakasan khusus logam kosong saya yang dihoskan di Hetzner untuk bercanggah dengan HDD dan SSD yang dilampirkan. Terdapat banyak pilihan dalam ruang (LVM standard, mdraid btrfs, dsb), tetapi saya memilih ZFS kerana ia mempunyai tugas semula dan ergonomik. Saya tidak akan membebankan sesiapa pun dengan sebabnya, tetapi salah satu perkara yang saya perlukan untuk menavigasi ialah cara memasang versi ZFS yang lebih baharu pada Ubuntu 20.04 (salah satu sistem pengendalian yang disokong di Hetzner). Saya menghadapi beberapa isu (terutamanya selepas pemasangan) semasa menyediakan ZFS pada sistem saya jadi saya ingin memberikan panduan tentang cara saya melakukannya. Siaran ini ialah penjelasan rangkap demi rangkap skrip Ansible saya yang memasang ZFS. Sebelum anda mengetahui sama ada ZFS (atau mana-mana sistem fail) berbaloi untuk beralih kepada, anda mungkin akan mahu RTFM. ZFS mempunyai banyak seluk beluk dan saya pastinya bukan pakar dalam hal itu, tetapi mengetahui bagaimana dan mengapa, serta istilah dan juga sejarah projek adalah sangat penting. Beberapa pautan untuk membantu anda bermula: Bersama-sama dengan ZFS (yang mungkin kuantiti yang paling tidak diketahui di sini) anda mungkin ingin membiasakan diri dengan Ubuntu dan pentadbiran sistem am. Ituâ berhenti dari kawasan yang luas untuk diliputi tetapi berikut adalah beberapa pautan: Ia hampir tidak perlu dikatakan tetapi jika anda tidak begitu biasa dengan pentadbiran sistem linux pada ketika ini, anda mungkin tidak sepatutnya mencuba ini. Saya secara peribadi memilih untuk mempunyai cakera saya dalam konfigurasi yang agak tersuai â Saya mempunyai persediaan RAID1 (cerminan) melalui mdraid, bersama-sama dengan partition pada setiap cakera yang boleh saya berikan kepada ZFS untuk diurus. Sebaik-baiknya, saya mempunyai keseluruhan cakera untuk diberikan kepada ZFS tetapi partition juga berfungsi. Persediaan OS ( installimage) yang termasuk persediaan cakera dijalankan daripada mod penyelamat Hetzner dan boleh dibimbing dengan fail seperti berikut: # Perisytiharan Drive yang digunakan oleh installimage DRIVE0 /dev/nvme0n1 DRIVE1 /dev/nvme1n1 # Dayakan Software RAID (untuk cakera OS) SWRAID 1 SWRAIDLEVEL 1 # Pemuat But (biasanya grub) Grub BOOTLOADER # Mesin hostame mesin HOSTNAME01 konfigurasi PART swap swap 32G PART /boot ext4 1G PART / ext4 128G # Parittion terakhir ini akan dibuat (disapu& dicipta semula sebagai ZFS kemudian) BAHAGIAN /root-disk-remaining ext4 all # Anda boleh menentukan imej yang Hetzner gunakan dengan mengakses bahagian rangkaian mereka IMEJ /root/.oldroot/nfs/images/Ubuntu-2004-focal-64-minimal.tar. gz Ini jelas agak khusus Hetzner, tetapi lakukan apa sahaja yang anda perlu lakukan pada sistem anda sendiri untuk mempunyai partition/drive yang tersedia untuk digunakan oleh ZFS. zfsutils-linuxand zfs-zed Dalam Ansible YAML langkahnya kelihatan seperti ini: - nama: Pegang semua pakej huluan berkaitan zfs ansible.builtin.shell: | apt-mark tahan zfsutils-linux apt-mark tahan zfs-zed Setakat penulisan siaran ini versi zfs-linux dalam Ubuntu Focal ialah 0.8.3. Memandangkan matlamat kami di sini adalah untuk memasang dan terus menggunakan versi yang lebih baharu, kami ingin memastikan bahawa ada kemas kini apt tidak menggantikan versi kami yang dipasang dengan versi yang lebih lama. Sementara kita di sini, mari kita bersihkan bungkusan itu juga. - nama: Bersihkan pakej huluan (ubuntu) ZFS jika dipasang ignore_errors: yes ansible.builtin.command: | apt purge --allow-change-held-packages zfsutils-linux zfs-zed Anda boleh membaca dokumen di sesuai untuk melihat apa purge â ia serupa dengan mengalih keluar tetapi juga mengalih keluar fail konfigurasi jika ada. Anda boleh memasang kebergantungan untuk OpenZFS seperti: - nama: Keperluan pemasangan untuk membina ZFS ansible.builtin.apt: name:packagesupdate_cache: yes state: present vars: packages: - build-essential - autoconf - automake - libtool - gawk - alien - fakeroot - dkms - libblkid-dev - uuid -dev - libudev-dev - libssl-dev - zlib1g-dev - libaio-dev - libattr1-dev - libelf-dev # Baris di bawah memanggil output `uname -r`, contohnya "5.16.5-arch1- 1"untuk sistem gerbang saya # jadi baris itu akan diselesaikan kepada sesuatu seperti "linux-headers-5.16.5-arch1-1"(tidak sah di Ubuntu sudah tentu, tetapi sebagai contoh) - linux-headers uname_r.stdout }} - python3 - python3-dev - python3-setuptools - python3-cffi - libffi-dev - python3-packaging - git - libcurl4-openssl-dev Mungkin terdapat beberapa kebergantungan yang tidak begitu diperlukan tetapi hampir kesemuanya perlu diperlukan. /opt/zfs Inilah ZFS: - nama: Cipta /opt/zfs ansible.builtin.file: laluan: /opt/zfs state: direktori Jika anda ingin memuat turun ZFS: - nama: Muat turun zfs ansible.builtin.get_url: url: "httpsgithub.com/openzfs/zfs/releases/download/zfs _zfs_version zfs _zfs_version tar.gz"checksum:_zfs_tarball_sha256_checksummode: 0755 dest_zfs//opt .gz"Di sini penggantian {{ _zfs_version }} ( 2.1.1. Anda juga ingin melakukan muat turun sendiri dan mengumpul/menjana jumlah semak untuk digunakan. Jangan sekali-kali memuat turun bahan daripada internet yang tidak sepatutnya berubah tanpa checsum! {{adalah sintaks templat Ansible) ialah Dan jika anda ingin menyalinnya dari komputer tempat Ansible sedang berjalan (inilah yang saya lakukan): - nama: Salin pakej zfs (elakkan had kadar) ansible.builtin.copy: src: files/zfs/zfs _zfs_version tar.gz"mod: 0755 dest: "/opt/zfs/zfs _zfs_version tar.gz"Tidak kira bagaimana anda memilih untuk mendapatkan sumber yang anda perlukan untuk menyahzipnya sudah tentu: - nama: Nyahzip kod zfs ansible.builtin.unarchive: src: "/opt/zfs/zfs _zfs_version tar.gz"dest: "/opt/zfs"remote_src: yes Untuk memulakan proses binaan: - nama: Persediaan dan Bina ZFS ansible.builtin.shell: | ./autogen../configure make clean make -j args: chdir: "/opt/zfs/zfs _zfs_version Jika anda biasa membina sesuatu daripada sumber, pelbagai projek menggunakan set alat biasa ini (beberapa varian buat, autogen dan konfigurasikan skrip). Seperti yang anda jangkakan ini mungkin mengambil sedikit masa, jadi beri sedikit masa. Selepas membina ZFS - nama: Pasang ZFS ansible.builtin.shell: | buat args pemasangan: chdir: "/opt/zfs/zfs _zfs_version Biasanya anda akan fikir kami akan selesai *di sini*, tetapi siaran ini wujud kerana melakukan ini secara amnya tidak mencukupi! Mari tekan ke hadapan. Mula-mula paksa pemunggahan modul ZFS jika ia berjalan: - nama: Punggah paksa modul ZFS(ss) ansible.builtin.shell: | ./scripts/zfs.-u args: chdir: "/opt/zfs/zfs _zfs_version Adalah sesuai untuk *tidak* menjalankan sebarang beban kerja apabila perkara ini berlaku, seperti yang anda jangkakan. Semasa modul dipunggah, kami boleh memasang beberapa pembantu: - nama: Pembantu ZFS Selepas Pemasangan ansible.builtin.shell: | ./scripts/zfs-helpers.-i args: chdir: "/opt/zfs/zfs _zfs_version Selepas pembantu dipasang, mari paksa muat semula modul ZFS: - nama: Muat semula paksa modul ZFS ansible.builtin.shell: | ./scripts/zfs.args: chdir: "/opt/zfs/zfs _zfs_version Saya telah menemui bangunan itu dan menggunakan modul deb (format yang digunakan oleh Debian untuk pemasangan pakej) juga membantu memastikan pemasangan melekat dan tidak digantikan dengan lalai pakej Ubuntu. Mula-mula bina pakej deb ZFS daripada kod sumber: - nama: Bina pakej deb ZFS ansible.builtin.shell: | buat deb args: chdir: "/opt/zfs/zfs _zfs_version Dan kemudian pasangkannya - nama: Pasang pakej deb ZFS ansible.builtin.shell: | ya | dpkg -i --force-overwrite deb apt install -f -y deb args: chdir: "/opt/zfs/zfs _zfs_version Secara teorinya langkah ini *tidak sepatutnya* diperlukan (atau harus digunakan secara bersendirian), kerana kami telah pun menjalankan proses pemasangan, tetapi saya mendapati bahawa apabila melakukan satu atau yang lain, saya Âd mempunyai situasi di mana permulaan semula akan menggesa versi lama ZFS untuk digunakan (walaupun apt purge) â terutamanya pada peringkat kernel. modprobe Jika anda ingin mendayakan modul ZFS yang dipasang serta-merta, gunakan modprobe: - nama: Modprobe blok modul zfs: - nama: Pasang modul kernel zfs community.general.modprobe: nama: zfs state: present Memasang ZFS bermakna memasang modul kernel, tetapi oleh kerana kami belum cukup membakarnya melalui Sokongan Modul Kernel Dinamik, kami perlu mendayakan modul kernel yang dipasang secara tempatan untuk digunakan: - nama: Pastikan tambahan berada di hadapan ansible.builtin.lineinfile: laluan: /etc/modules-load.d/modules.conf regexp: '^search'baris: "cari kemas kini tambahan ubuntu built-in"keadaan: sekarang Perkara ini dilakukan ialah memastikan bahawa fail yang menguruskan laluan carian modul kernel /etc/modules-load.d/modules.conf mempunyai baris di dalamnya yang mempunyai cari kemas kini tambahan yang ditentukan. Biasanya terdapat sekurang-kurangnya satu baris yang bermula dengan cari, dan apa yang kita mahu lakukan ialah pastikan lokasi modul tambahan dicari pada awal proses. Kami akan mahu memasang melalui subsistem DKMS: - nama: dkms install zfs ansible.builtin.shell: | dkms install zfs _zfs_version }} args: chdir: "/opt/zfs/zfs _zfs_version Pada ketika ini, anda sepatutnya dapat menyemak versi ZFS aktif semasa, dan ia sepatutnya menunjukkan kepada anda sesuatu seperti ini: root@machine01 ~ # versi zfs zfs-2.1.1-1 zfs-kmod-2.1.1-1 Terdapat beberapa unit SystemD (seperti biasa Digital Ocean mempunyai beberapa dokumen hebat) yang dibuat tetapi perlu didayakan untuk digunakan oleh ZFS: - nama: Pastikan unit systemd berkaitan zfs didayakan blok: - ansible.builtin.systemd: name:itemstate: mula didayakan: gelung ya: - zfs-import-cache.service - zfs-import.target - zfs-mount.service - zfs-share.service - zfs-zed.service - zfs-volume-wait.service - zfs.target Pembolehubah yang digelung adalah serupa dengan berjalan systemd start and systemd enable . The security-minded reader at home is no doubt cringing into the atmosphere by now, but making sure my kernel upgrades are manual is the only way I’ve found to ensure that the installed version of ZFS was not disabled/unexpectedly altered/broken by kernel upgrades: - name: Hold all kernel upgrades to prevent custom built ZFS from doing fallback ansible.builtin.shell: | apt-mark hold linux-headers-generic apt-mark hold linux-image-generic apt-mark hold {{ uname_r.stdout }} # you'll need that `uname -r` output again here I personally prefer to hold back any kernel upgrades and instead perform them at machine setup rather than during operation. DKMS *should* ensure that with the building of any new kernel the ZFS code is rebuilt but it’s been flaky in the past so I find it hard to trust. Along with all the kernel changes we’ve made so far (good and questionable), one thing we’ll want to do is add the configuration necessary to ensure the kernel module is loaded: - name: Ensure zfs kernel module comes up with next restart tags: [ "zfs:post-install:config" ] block: - name: Add zfs module load file ansible.builtin.template: src: templates/kernel-modules/zfs.conf.j2 dest: /etc/modules-load.d/zfs.conf owner: root group: root mode: 0644 Now that we have ZFS installed (restart once to check I’m going to leave the rest of the cluster setup to you. There are a *lot* of ways to use ZFS and setup zpools (RAID0/1/5/Z Actually using ZFS properly is out of scope (I can only hope I’ve covered *installing* it properly, at least), but please refer to the usual manuals there to set up your ZFS pool and storage requirements. Trying to cover even the basics of how to setup ZFS for your drives once it’s been installed is certainly a lot of reading so we’ll leave it there for today. This is the part where you “draw the rest of the owl” (sorry). txg_timeout While experimenting with some write modes for Postgres on ZFS, I looked into an optimization modes that involved reducing the txg_timeout from it’s default of 5 seconds to 1 second. While I won’t get into the tradeoffs implied by that move (please read my post on Postgres + ZFS), here is the setup that I’ve used for modifying txg_timeout per-machine (some machines might use the optimization some might not): - name: Add systemd unit to support txg timeout customization tags: [ "zfs:post-install:config" ] block: - name: Set current ZFS txg_timeout (to 1) ansible.builtin.shell: | echo 1 > /sys/module/zfs/parameters/zfs_txg_timeout - name: install zfs-config-txg-timeout service ansible.builtin.template: src: templates/zfs-config-txg-timeout.service.j2 dest: /etc/systemd/system/zfs-config-txg-timeout.service owner: root group: root mode: 0644 - name: start & enable zfs-config-txg-timeout service ansible.builtin.systemd: name: zfs-config-txg-timeout.service state: started enabled: yes daemon_reload: yes The template that goes with that looks like this: [Unit] Description=Set ZFS txg_timeout After=zfs.target ConditionPathIsDirectory=/sys/module/zfs [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/bash -c 'echo {{ _zfs_txg_timeout_seconds | default(zfs_txg_timeout_seconds) }} > /sys/module/zfs/parameters/zfs_txg_timeout' # Not needed since we want it to always be whatever the setting is # ExecStop=/usr/bin/bash -c 'echo {{ _zfs_txg_timeout_seconds | default(zfs_txg_timeout_seconds) }} > /sys/module/zfs/parameters/zfs_txg_timeout' [Install] WantedBy=multi-user.target Obviously you’ll want to define {{ _zfs_txg_timeout_seconds }} and the zfs_txg_timeout_seconds. In general, this will make sure that the txg_timeout is set to what you want it to be upon startup after ZFS has started. Wasn’t that easy? If you’re answering no, it wasn’t easy for me to figure out either! I spent a lot of time wondering why DKMS wasn’t working properly (which is why the hack of preventing kernel upgrades is still included) and dealing with other issues. The OpenZFS documentation is pretty great but seems to be missing a guide somewhat like this, so hopefully this post will save people some time going forward when trying to experiment with new ZFS setups on Hetzner. Another thing I’m hoping for with this post is to be corrected – if you see something glaringly wrong in my setup, please reach out. The more people can use low cost infrastructure providers like Hetzner, the more cool software we get and the more interesting/innovative products can be built. To that end I’m working on NimbusWS (I’m behind on this but should launch by end of Q1 2022) – if you’re interested please sign up for the service and kick the tires (free tier usage will be available).