介绍
由于SSD的结构是固态驱动器,如果连续使用会导致降低性能,TRIM命令允许操作系统将哪些数据块不再使用的信息传播到SSD,TRIM对设备的性能和整个寿命都有重要影响。
一个更温和的选择是配置周期性TRIM,在几乎所有情况下,它都提供了相同的持续TRIM好处,而不影响性能。
禁用连续TRIM
你可能已经在设备安装时启用了连续TRIM,在启用定期TRIM之前,先看看我们当前的挂载选项是有意义的。
通过使用discard选项安装驱动器或分区来启用连续TRIM。
首先,找到当前使用discard选项挂载的文件系统:findmnt -O discardOutputTARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/sda1 ext4 rw,relatime,discard,data=ordered
/mnt/data2 /dev/sdb1 ext4 rw,relatime,discard,data=ordered
你可以在不使用discard选项的情况下将这些文件系统重新挂载,方法是包含带有mount的-o remount,nodiscard :sudo mount -o remount,nodiscard /mnt/data
sudo mount -o remount,nodiscard /mnt/data2
如果再次运行findmnt命令,则不会收到结果:findmnt -O discard
接下来,打开/etc/fstab文件查看当前为你的文件系统定义的挂载选项,确定文件系统每次引导时的挂载方式:sudo nano /etc/fstab
查找discard选项并将它从你找到的行删除:/etc/fstab. . .
# /dev/sda1 /mnt/data ext4 defaults,nofail,discard 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
# /dev/sdb1 /mnt/data2 ext4 defaults,nofail,discard 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0
完成后保存并关闭文件,现在将不使用discard选项挂载文件系统,并且在后续的引导中将以同样的方式挂载,现在,我们可以为支持它的所有文件系统设置定期TRIM。
systemd建立周期TRIM
cat /etc/cron.weekly/fstrimOutput#!/bin/sh
# trim all mounted file systems which support it
/sbin/fstrim --all || true
你可以看到,这个脚本需要一个带有--all标志的fstrim版本,许多版本的fstrim以早期版本发布并不包含此选项。
其他systemd 发行版
对于其他systemd发行版,可以通过fstrim.timer文件启用周期TRIM,这将在所有可用的驱动器上运行TRIM操作,这也利用了fstrim --all选项。
在编写本文时,这是以下发行版的最佳方法:Debian,Fedora CoreOS
对于CentOS ,fedora和CoreOS,fstrim.service和fstrim.timer单元在默认情况下可用,要计划每周TRIM所有已连接的驱动器,请启用.timer单元:sudo systemctl enable fstrim.timer
Debian,8在文件系统中有fstrim.service和fstrim.timer可用,但是,默认情况下没有加载到systemd中,你只需首先复制文件:sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system
启用与其他发行版相同的计时器:sudo systemctl enable fstrim.timer
你的服务器现在应该TRIM所有支持该操作的已挂载文件系统,每周一次。
建立非systemd的周期TRIM
巧妙的是,大多数发布非systemd init系统的发布版也带有fstrim实用程序的版本,但是没有--all标志,这使得安全的自动TRIM操作更加困难。
在不支持它或不正确实现的设备上使用TRIM可能是危险的,并导致数据丢失,--all标志可以安全地处理这些场景,但是可以手动尝试确定附加驱动器是否正确支持操作。
在Ubuntu中,有一个名为fstrim-all的简短脚本,它尝试执行此操作,cron运行的每周脚本执行这个操作,但是,脚本并不总是正确地解析驱动器的TRIM能力。
对于没有--all标志的fstrim命令和其他发行版,最好的解决方案是编译包含标志的fstrim的静态链接版本。
这可能是以下发行版的最佳选项:Ubuntu 14.04 ,Ubuntu 12.04 ,Debian 7 ,,CentOS 6
对于Ubuntu 14.04:最好禁用脚本运行,因为它可能无法正确检测状态:sudo chmod a-x /etc/cron.weekly/fstrim
sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak
安装软件编译工具
首先,安装所需的软件构建工具。
对于Ubuntu和Debian系统,可以通过键入以下命令来完成:sudo apt-get update
sudo apt-get install build-essential
对于CentOS系统,你可以通过键入以下命令来安装类似的工具集:sudo yum groupinstall 'Development Tools'
现在,你有了编译fstrim的最新版本所需的构建依赖项。
下载并提取源文件
你在这里可以找到按发布版本组织的源代码。
单击软件包的最新版本,
在下一个目录中,找到软件的最新tarball ,这将从util-linux-开始,以.tar.gz结束,当前,最新的稳定版本是util-linux-2.28.1.tar.gz ,右键单击适当的链接并将它复制到剪贴板。
回到服务器,移动到/tmp目录,cd /tmp
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.gz
然后,提取tarball以创建源目录结构:tar xzvf util-linux*
现在我们已经拥有了源代码和构建工具,我们可以构建软件了。
配置和编译静态链接的FSTRIMcd /tmp/util-linux*
由于我们只安装独立的fstrim二进制文件,并且不希望覆盖包管理系统管理的实用程序和库,所以,我们将编译一个静态二进制文件。
为此,我们需要启用静态链接,并且禁用共享库,通过键入以下命令配置有以下属性的软件:./configure --enable-static --disable-shared
配置完软件后,你可以通过键入以下命令来编译fstrim实用程序:make fstrim
我们将创建一个名为/cron-bin的目录,并将二进制文件放入其中:sudo mkdir /cron-bin
sudo cp /tmp/util-linux*/fstrim /cron-bin
创建每周Cron脚本以运行fstrim
通过键入以下命令创建文件:sudo nano /etc/cron.weekly/fstrim
在内部,粘贴以下行,这将使用--all选项运行我们的新fstrim二进制文件:/ETC/CRON ,每周fstrim#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim --all || true
完成后保存并关闭文件。
键入以下命令使脚本可执行:sudo chmod a+x /etc/cron.weekly/fstrim
cron和anacron守护进程将每周运行这个脚本来TRIM文件系统。
结束语
TRIM有助于最大程度地提高你的SSD的长期性能和寿命。
连续TRIM操作听起来可能是理想的,但是文件系统会添加显著的开销。