diff --git a/etc/Makefile.am b/etc/Makefile.am index 53064eb6f6ea..b4b3ae1f5798 100644 --- a/etc/Makefile.am +++ b/etc/Makefile.am @@ -1,95 +1,98 @@ sudoersddir = $(sysconfdir)/sudoers.d sudoersd_DATA = \ %D%/sudoers.d/zfs dist_noinst_DATA += $(sudoersd_DATA) sysconf_zfsdir = $(sysconfdir)/zfs dist_sysconf_zfs_DATA = \ %D%/zfs/vdev_id.conf.alias.example \ %D%/zfs/vdev_id.conf.multipath.example \ %D%/zfs/vdev_id.conf.sas_direct.example \ %D%/zfs/vdev_id.conf.sas_switch.example \ %D%/zfs/vdev_id.conf.scsi.example sysconf_zfs_DATA = \ %D%/zfs/zfs-functions SUBSTFILES += $(sysconf_zfs_DATA) SHELLCHECKSCRIPTS += $(sysconf_zfs_DATA) $(call SHELLCHECK_OPTS,$(sysconf_zfs_DATA)): SHELLCHECK_SHELL = sh if BUILD_LINUX initconf_DATA = \ %D%/default/zfs SUBSTFILES += $(initconf_DATA) SHELLCHECKSCRIPTS += $(initconf_DATA) $(call SHELLCHECK_OPTS,$(initconf_DATA)): SHELLCHECK_SHELL = sh if INIT_SYSV dist_noinst_DATA += %D%/init.d/README.md init_SCRIPTS = \ %D%/init.d/zfs-import \ %D%/init.d/zfs-load-key \ %D%/init.d/zfs-mount \ %D%/init.d/zfs-share \ %D%/init.d/zfs-zed SUBSTFILES += $(init_SCRIPTS) SHELLCHECKSCRIPTS += $(init_SCRIPTS) $(call SHELLCHECK_OPTS,$(init_SCRIPTS)): SHELLCHECK_SHELL = sh endif if INIT_SYSTEMD dist_systemdpreset_DATA = \ %D%/systemd/system/50-zfs.preset systemdunit_DATA = \ %D%/systemd/system/zfs-import-cache.service \ %D%/systemd/system/zfs-import-scan.service \ %D%/systemd/system/zfs-import.target \ %D%/systemd/system/zfs-mount.service \ %D%/systemd/system/zfs-scrub-monthly@.timer \ %D%/systemd/system/zfs-scrub-weekly@.timer \ %D%/systemd/system/zfs-scrub@.service \ + %D%/systemd/system/zfs-trim-monthly@.timer \ + %D%/systemd/system/zfs-trim-weekly@.timer \ + %D%/systemd/system/zfs-trim@.service \ %D%/systemd/system/zfs-share.service \ %D%/systemd/system/zfs-volume-wait.service \ %D%/systemd/system/zfs-volumes.target \ %D%/systemd/system/zfs-zed.service \ %D%/systemd/system/zfs.target SUBSTFILES += $(systemdunit_DATA) INSTALL_DATA_HOOKS += systemd-install-data-hook systemd-install-data-hook: $(MKDIR_P) "$(DESTDIR)$(systemdunitdir)" ln -sf /dev/null "$(DESTDIR)$(systemdunitdir)/zfs-import.service" systemdgenerator_PROGRAMS = \ %D%/systemd/system-generators/zfs-mount-generator %C%_systemd_system_generators_zfs_mount_generator_SOURCES = \ %D%/systemd/system-generators/zfs-mount-generator.c %C%_systemd_system_generators_zfs_mount_generator_LDADD = \ libzfs.la %C%_systemd_system_generators_zfs_mount_generator_LDFLAGS = -pthread CPPCHECKTARGETS += $(systemdgenerator_PROGRAMS) endif if WANT_MODULES_LOAD_D dist_modulesload_DATA = \ %D%/modules-load.d/zfs.conf endif endif diff --git a/etc/systemd/system/zfs-trim-monthly@.timer.in b/etc/systemd/system/zfs-trim-monthly@.timer.in new file mode 100644 index 000000000000..8c13ffb304b3 --- /dev/null +++ b/etc/systemd/system/zfs-trim-monthly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Monthly zpool trim timer for %i +Documentation=man:zpool-trim(8) + +[Timer] +OnCalendar=monthly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-trim@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-trim-weekly@.timer.in b/etc/systemd/system/zfs-trim-weekly@.timer.in new file mode 100644 index 000000000000..dced3d88b5c9 --- /dev/null +++ b/etc/systemd/system/zfs-trim-weekly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Weekly zpool trim timer for %i +Documentation=man:zpool-trim(8) + +[Timer] +OnCalendar=weekly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-trim@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-trim@.service.in b/etc/systemd/system/zfs-trim@.service.in new file mode 100644 index 000000000000..423fb448c16f --- /dev/null +++ b/etc/systemd/system/zfs-trim@.service.in @@ -0,0 +1,15 @@ +[Unit] +Description=zpool trim on %i +Documentation=man:zpool-trim(8) +Requires=zfs.target +After=zfs.target +ConditionACPower=true +ConditionPathIsDirectory=/sys/module/zfs + +[Service] +EnvironmentFile=-@initconfdir@/zfs +ExecStart=/bin/sh -c '\ +if @sbindir@/zpool status %i | grep -q "(trimming)"; then\ +exec @sbindir@/zpool wait -t trim %i;\ +else exec @sbindir@/zpool trim -w %i; fi' +ExecStop=-/bin/sh -c '@sbindir@/zpool trim -s %i 2>/dev/null || true' diff --git a/man/man8/zpool-trim.8 b/man/man8/zpool-trim.8 index d9a7b4400301..ad0909a3b08d 100644 --- a/man/man8/zpool-trim.8 +++ b/man/man8/zpool-trim.8 @@ -1,91 +1,112 @@ .\" .\" CDDL HEADER START .\" .\" The contents of this file are subject to the terms of the .\" Common Development and Distribution License (the "License"). .\" You may not use this file except in compliance with the License. .\" .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE .\" or http://www.opensolaris.org/os/licensing. .\" See the License for the specific language governing permissions .\" and limitations under the License. .\" .\" When distributing Covered Code, include this CDDL HEADER in each .\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. .\" If applicable, add the following below this CDDL HEADER, with the .\" fields enclosed by brackets "[]" replaced with your own identifying .\" information: Portions Copyright [yyyy] [name of copyright owner] .\" .\" CDDL HEADER END .\" .\" Copyright (c) 2007, Sun Microsystems, Inc. All Rights Reserved. .\" Copyright (c) 2012, 2018 by Delphix. All rights reserved. .\" Copyright (c) 2012 Cyril Plisko. All Rights Reserved. .\" Copyright (c) 2017 Datto Inc. .\" Copyright (c) 2018 George Melikov. All Rights Reserved. .\" Copyright 2017 Nexenta Systems, Inc. .\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved. .\" .Dd May 27, 2021 .Dt ZPOOL-TRIM 8 .Os . .Sh NAME .Nm zpool-trim .Nd initiate TRIM of free space in ZFS storage pool .Sh SYNOPSIS .Nm zpool .Cm trim .Op Fl dw .Op Fl r Ar rate .Op Fl c Ns | Ns Fl s .Ar pool .Oo Ar device Ns Oc Ns … . .Sh DESCRIPTION Initiates an immediate on-demand TRIM operation for all of the free space in a pool. This operation informs the underlying storage devices of all blocks in the pool which are no longer allocated and allows thinly provisioned devices to reclaim the space. .Pp A manual on-demand TRIM operation can be initiated irrespective of the .Sy autotrim pool property setting. See the documentation for the .Sy autotrim property above for the types of vdev devices which can be trimmed. .Bl -tag -width Ds .It Fl d , -secure Causes a secure TRIM to be initiated. When performing a secure TRIM, the device guarantees that data stored on the trimmed blocks has been erased. This requires support from the device and is not supported by all SSDs. .It Fl r , -rate Ar rate Controls the rate at which the TRIM operation progresses. Without this option TRIM is executed as quickly as possible. The rate, expressed in bytes per second, is applied on a per-vdev basis and may be set differently for each leaf vdev. .It Fl c , -cancel Cancel trimming on the specified devices, or all eligible devices if none are specified. If one or more target devices are invalid or are not currently being trimmed, the command will fail and no cancellation will occur on any device. .It Fl s , -suspend Suspend trimming on the specified devices, or all eligible devices if none are specified. If one or more target devices are invalid or are not currently being trimmed, the command will fail and no suspension will occur on any device. Trimming can then be resumed by running .Nm zpool Cm trim with no flags on the relevant target devices. .It Fl w , -wait Wait until the devices are done being trimmed before returning. .El +.Sh PERIODIC TRIM +On machines using systemd, trim timers can be enabled on a per-pool basis. +.Nm weekly +and +.Nm monthly +timer units are provided. +.Bl -tag -width Ds +.It Xo +.Xc +.Nm systemctl +.Cm enable +.Cm zfs-trim-\fIweekly\fB@\fIrpool\fB.timer +.Cm --now +.It Xo +.Xc +.Nm systemctl +.Cm enable +.Cm zfs-trim-\fImonthly\fB@\fIotherpool\fB.timer +.Cm --now +.El . .Sh SEE ALSO +.Xr systemd.timer 5 , .Xr zpoolprops 7 , .Xr zpool-initialize 8 , .Xr zpool-wait 8