确定在SSD上的跨平台方式?

我在Rust中编写了一个工具,需要根据当前文件系统是SSD还是传统硬盘来改变其function。

运行时的不同之处在于,如果SSD上存在文件,则会使用更多的线程来访问文件,而不是HDD,这只会影响磁盘并降低性能。

我主要对Linux感兴趣,因为这是我的用例,但欢迎任何其他增加。 如果可能,我还需要以非root用户身份执行此操作。 有一个系统调用或文件系统设备,它会告诉我什么样的设备,我在?

信贷到@Hackerman :

 $ cat /sys/block/sda/queue/rotational 0 

如果它返回1,给定的文件系统是旋转媒体。

我已经将这个概念充实到一个shell脚本中,它可靠地确定文件是否在旋转媒体上。

 #!/bin/bash set -e # emits the device path to the filesystem where the first argument lives fs_mount="$(df -h $1 | tail -n 1 | awk '{print $1;}')" # if it's a symlink, resolve it if [ -L "$fs_mount" ]; then fs_mount="$(readlink -f $fs_mount)" fi # if it's a device-mapper like LVM or dm-crypt, then we need to be special if echo $fs_mount | grep -oP '/dev/dm-\d+' >/dev/null ; then # get the first device slave first_slave_dev="$(find /sys/block/$(basename $fs_mount)/slaves -mindepth 1 -maxdepth 1 -exec readlink -f {} \; | head -1)" # actual device dev="$(cd $first_slave_dev/../ && basename $(pwd))" else dev="$(basename $fs_mount | grep -ioP '[az]+(?=\d+\b)')" fi # now that we have the actual device, we simply ask whether it's rotational or not if [[ $(cat /sys/block/$dev/queue/rotational) -eq 0 ]]; then echo "The filesystem hosting $1 is not on an rotational media." else echo "The filesystem hosting $1 is on rotational media." fi 

上面的作品对于我在普通分区(即/dev/sda1被安装在给定的路径)和dm-crypt分区(即/dev/mapper/crypt被安装在给定的路径)都有效。 我没有用LVM测试过,因为我附近没有。

对于Bash不便携的道歉。