SSD安装ubuntu系统的优化

近日入手一块固态硬盘,考虑到固态硬盘使用寿命跟读写次数有很大关系,所以有必要在装完系统后做一些优化,并对网上很多优化方案在测试通过后,撰写了本篇文章.

文章目录

    • 0. 常识
    • 1. 开启TRIM功能
    • 2. swap配置
    • 3. 将 `/tmp `以` tmpfs` 形式挂载
    • 4. 关闭日志文件
    • 5. 使用noop磁盘调度
    • 6. 测试SSD速度
    • 7. 分区对齐
    • 8. 定期检查SSD状态,并做数据备份


2018/9 补充:
经过几次折腾,总结下在SSD上装ubuntu系统的正确步骤应该是这样的:
确定分区方案–>制作U盘启动盘–>安装系统–>系统优化–>定期检查硬盘状态

2018/6 补充:
1)关于分区方案
参考:https://juejin.im/post/5a321db6f265da430c11d5c0
先将windows安装在HDD,后将ubuntu安装在SSD
考虑到需要跨硬盘启动系统,所以需要在HDD中预留200M的空间用于安装ubuntu的boot,参考:win10下安装linux双系统进不了linux,如果不这样做的话,每次启动都要在bois option来选择则启动硬盘,参考:双硬盘分别安装windows和Ubuntu双系统

另外也将ubuntu的swap分区放到HDD,避免了对固态硬盘的频繁读写,
/home和根目录安装到SSD即可,也可以不划分

关于使用UEFI+GPT方案的,参考:https://www.jianshu.com/p/036fa0ca31b1

2)关于交换空间
交换空间也叫,虚拟内存,linux基本上是在raw用完了才使用交换空间(这里需要设置一下),一般设置个256M的交换分区足够,如果需要休眠的话(注意:休眠与挂起的区别),考虑留个与raw同等大小的swap,需要注意,swap分区尽量放在机械硬盘上,如果放在SSD上也需要做一定的优化(下面会解决这个问题).
没有必要在装系统的时候新建了交换空间的分区,可以考虑新建一个swap文件,效果跟swap分区一样,不需要的时候可以删除,相比删除一个分区更为简单.


0. 常识

参考: https://www.jianshu.com/p/nQpqsN

1)BIOS设置为AHCI;
2)购买SSD的1年内,每隔几个月去官网检查是否有固件升级;
3)有条件的加满RAM,因为它比SSD便宜。
4)不要使用TLC芯片的SSD
5)不要做碎片整理操作Defragmentation
6)不建议开启hibernation休眠功能,因为会有大量的数据读写。但是从笔记本使用角度来说,还是开着吧,关了也要操作很多配置。


1. 开启TRIM功能

SSD要保持长期稳定和速度,就需要启用TRIM,这是让SSD在非尖峰读写时间才去真正抹除芯片上被标记抹除的资料。

1)首先,检查内核版本是否支持TRIM:

uname -a

2)然后,检查SSD硬盘是否支持TRIM:

hdparm -I /dev/sda

3)如果显示比如(不同硬件可能不同提示):

* Data Set Management TRIM supported

4)要开启TRIM支持,就得编辑fstab,在指定的磁区挂载选项加上discard,这个设置。
这一步用在所有/或者/home等分区,不要用在/swap
如果有/boot/efi分区,不要加进来,不需要。swap也不需要

注意,对于长期不关机电脑,该任务需要使用cron定时执行,参考: Ubuntu使用SSD需要做的配置和优化
手动执行:sudo fstrim -v /

下面是我的/etc/fstab的配置文件

UUID=ca27d8c3-a572-4c81-9d7a-ffcbcd3afa12 /               ext4   noatime,discard,errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=ecccb054-de0c-4a90-b2ef-1b11d72cd1b0 /boot           ext4    noatime,discard,defaults        0       2
# /home was on /dev/sda5 during installation
UUID=eccb1720-0af7-43bc-8e63-47d96dec201a /home           ext4   noatime,discard,defaults        0       2
# /storage was on /dev/sda
UUID=77a63891-de5c-4846-9b12-d704177179de /media/cy/storage ext4 noatime,discard,defaults 0 2
# swap was on /dev/sda6 during installation
UUID=15c56286-4568-4b67-b248-cf243604a8bb none            swap    sw              0       0
tmpfs   /tmp            tmpfs   defaults,noatime,mode=1777      0       0
tmpfs   /var/tmp        tmpfs   defaults,noatime,mode=1777      0       0
tmpfs   /var/log        tmpfs   defaults,noatime,mode=1777      0       0

5)其中noatimenodiratime是禁用
noatime是为了,当访问文件时,系统会更新last-access这个文件/目录元数据,设置noatime后可以减少这种操作。使用 noatime选项阻止了读文件时的写操作,noatime已经包含了nodiratime。不需要同时指定

6)文件的最后将 /tmp、/var/tmp 和 /var/log 三个目录挂载到内存上了,这样做有两个目的:

  • 利用内存来加速:内存的速度比硬盘的速度快得多,将这种频繁读写的目录挂载到内存中可以大大提高它们的读写速度
  • 减少对 SSD 的写入次数:因为这种临时目录通常都会保存很多小文件,而且读写频繁,为了提高 SSD 的寿命,把它们挂载到内存中

注意:上面的 /var/log 目录是系统日志所在的目录,如果挂载到内存中将意味着关机之后这些日志全部都会丢失!当然,对于个人来说通常历史系统日志是没什么用的,所以 LZ 把它们也挂载到内存中了。

7)测试新的fstab文件:

mount -o remount /dev/sda1

然后挂载:

mount

如果显示discard字样,说明成功,如:

/dev/sda1 on / type ext4 (rw,discard)

2. swap配置

/etc/sysctl.cnf末尾加入vm.swappiness=1, 代表着尽量不使用交换空间, 除非是内存已经用完了

echo 1 > /proc/sys/vm/swappiness

0到100之间,值越大换出量越大。

或者通过设置/proc/sys/vm/swappiness里面的值(上一种方法好像不起作用,这里推荐这种方法修改),来减少swap换出量:

>$ su
Password:
># echo 1 > /proc/sys/vm/swappiness
>#

其实这一步通常仅适用于把 SWAP 分配在 SSD 上的童鞋,像 LZ 这种把 SWAP 分配在机械硬盘上的,设不设置都无所谓.


3. 将 /tmptmpfs 形式挂载

1)如果内存够大,可以用ramdisk的方式,将一些经常变化的位置如/tmp放入内存,加快速度,减少对SSD的访问

sudo gedit /etc/fstab

在文件的最下面加上这一行

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0

重启或不重启,用 sudo mount -o remount /也可以

2)记得将浏览器等程序的缓存目录设置到/tmp

  1. 设置firefox的缓存移到/tmp
    打开firefox,输入about:config打开设置。添加一个新字符串,名称为:browser.cache.disk.parent_directory,值为/tmp
    要检查的话,浏览地址输入 about:cache

  2. Chrome设置 Chrome 在Linux下cache的位置是~/.cache/google-chrome/Cache.
    参考:http://teckoo.com/knowledge/linux/ssd.html
    第一种:

cd ~/.cache/google-chrome/Default
rm -rf Cache 
ln -s /tmp Cache 
rm -rf Media\ Cache 
ln -s /tmp Media\ Cache 

第二种: make the entire cache folder to /tmp

cd ~
rm -rf .cache
ln -s /tmp .cache

4. 关闭日志文件

参考:http://www.cnblogs.com/0xcafebabe/p/4491140.html

针对EXT4文件系统,选择了Ext4系统,接下来需要关闭日志功能(只针对EXT4分区
没有日志的情况下,文件系统更容易损坏,如突然断电,如果你甘愿冒这样的风险,从而延长SSD使用寿命,值得一试

1)首先,系统挂载时无法停用日志功能,所以需要进入刚才的U盘系统,利用root权限执行:

tune2fs -O ^has_journal /dev/sda1

即关闭/dev/sda1上的日志功能。其它所有EXT4分区都要这么处理

2)然后,运行操作系统检测:

e2fsck -f /dev/sda1

不这样,文件系统可能会出错。

3)最后,重启,进入SSD中的系统,检查是否设置成功:

dmesg | grep EXT4

如果出现:

EXT4-fs (sda1): mounted filesystem without journal

说明设置成功。原来是:

mounted filesystem with ordered data mode

4)如果需要再次开启日志功能,只要运行

tune2fs -O has_journal /dev/sda1

5. 使用noop磁盘调度

通常操作系统调度机械硬盘时会提供一些数据的物理位置,这样有利于机械硬盘优化寻道,但是对SSD没意义,所以采用noop磁盘调度,即简单发送请求,可以提高效率。

可以通过以下命令查看调度方法:(下面被中括号选中的表示当前的调度算法)

cat /sys/block/sda/queue/scheduler

比如显示:

noop [deadline] cfq

配置文件/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video-1024x768M@75m"

修改为:

GRUB_CMDLINE_LINUX_DEFAULT="elevator=noop quiet splash video-1024x768M@75m"

6. 测试SSD速度

sudo hdparm -Tt /dev/sdX

这个Xab,看你的SSD是第一个或第二个硬盘。我的是sda。
Timing cached reads: x MB in y seconds = z MB/sec这是读的速度,与你的SSD支持SATAII或SATAIII、以及上面的DRAM读的速度有关。
Timing buffered disk reads: x MB in y seconds = z MB/sec这个才是真正的SSD读的数值。
我的就是这样的结果:

/dev/sda:
Timing cached reads: 7148 MB in 2.00 seconds = 3576.12 MB/sec
Timing buffered disk reads: 1298 MB in 3.00 seconds = 432.40 MB/sec

7. 分区对齐

0)貌似不用考虑这步了,近年来SSD在出厂时已经对齐了

1)分区对齐(使用LiveUSB)
在LiveUSB内使用gparted分区后,再验证一下:

sudo fdisk -lu

看每个分区起始的数字,能被8整除,就是4K对齐。
另查看Sector size (logical/physical): 512 bytes / 4096 bytes,物理对齐为4k。

2)分区时选择ext4;如果同时有普通硬盘存在,swap放普通硬盘上;无需单独分出/home


8. 定期检查SSD状态,并做数据备份

可以使用命令sudo smartctl -data -A /dev/sda查看SSD状态,观察寿命。
233一行的值就是寿命,默认为100,当小于10的时候就要非常注意了。

通过这个命令来检测某个硬盘的健康状况

smartctl -s on -a /dev/sda 

硬盘的SMART信息包含很多部分。其中,"READ SMART DATA"部分显示出硬盘的整体健康状况。

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment rest result: PASSED

这个测试的结果是PASSEDFAILED。后者表示即将出现硬件故障,所以需要开始备份这块磁盘上的重要数据!


@leatherwang


你可能感兴趣的:(Linux)