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).