如何延长SD卡的使用寿命?


252

我并不是很想购买USB硬盘,但我知道SD卡不适合许多重复的读写操作。

当Raspberry Pi使用SD卡时,我可以采取任何措施来延长其寿命吗?


19
如果您全天候24/7全天全天候写入内容,则16GB的内容将持续30天。在正常使用情况下,基于10,000个写入周期,您可以期望大约27年。如果在50年内使用100,000个写周期。越大牌越长,将持续得益于巧妙的损耗均衡的逻辑
彼得·库拉

哇,这真是太好了,我不知道您的16gb sd在全速运行下可持续30天的第一点。我想不断地将视频录制到sd,然后再将其传输不是最好的主意。
SSH 2013年

3
有了这些解决方案带来的所有性能优势,为什么不每几年支付10美元呢?
亚历山大

Answers:


244

这些方法应通过各种方式最大程度地减少读取/写入次数,从而延长SD卡的使用寿命:

禁用掉期

交换是将部分SD卡用作易失性存储器的过程。这将增加可用的RAM数量,但会导致大量的读/写操作。不太可能显着提高性能。

使用以下swapoff命令禁用交换:

sudo swapoff --all

您还必须防止重新启动后重新出现:

  • 对于使用dphys-swapfile管理交换文件(而不是“常规”交换分区)的Raspbian,您可以简单sudo apt-get remove dphys-swapfile地将其永久删除。最好删除,因为CONF_SWAPSIZE本答案中所述将设置为0 似乎无效,并且在重新启动后仍会创建100MB交换文件。
  • 对于其他使用交换分区而不是交换文件的发行版,请从以下位置删除相应的行: /etc/fstab

在文件系统上禁用日记

使用日志文件系统(例如ext3ext4不带日志)是减少读取/写入的一种选择。在禁用日志功能的情况下使用文件系统的明显缺点是由于不当卸载而导致的数据丢失(例如,开机后掉电,内核锁定等)。

您可以ext3通过将挂载为来禁用日记功能ext2

您可以ext4像这样在未安装的驱动器上禁用日记功能:

tune4fs -O ^has_journal /dev/sdaX
e4fsck –f /dev/sdaX
sudo reboot

Noatime挂旗

通过将noatime挂载标志添加到SD卡上的分区中,将其分配给该分区的选项部分/etc/fstab

读取对文件系统的访问将不再导致与文件关联的atime信息的更新。noatime设置的重要性在于,它消除了系统对简单读取的文件进行文件系统写入的需求。如前一节所述,由于写入可能会有些昂贵,因此可以带来可观的性能提升。请注意,在启用此选项的情况下,只要写入文件,写入文件的时间信息就会继续更新。

RAM中的目录

高度使用的目录(例如,/var/tmp/并且可能/var/log可以通过以下方式重定位到RAM)/etc/fstab

tmpfs /var/tmp tmpfs nodev,nosuid,size=50M 0 0

这将允许/var/tmp使用50MB的RAM作为磁盘空间。这样做的唯一问题是,RAM中安装的所有驱动器在重启后都不会持续存在。因此,如果您挂载/var/log并且系统遇到导致其重新引导的错误,则您将无法找到原因。

外部硬盘中的目录

您还可以在永久性USB硬盘上装载某些目录。在此问题中可以找到更多详细信息。

Raspberry Pi也可以从外部驱动器引导其根分区。这可以通过USB或以太网进行,这意味着SD卡仅在引导期间用于委派给其他设备。这需要一些内核破解才能完成,因为我不认为默认内核支持USB存储。您可以在此问题或此外部博客文章中找到更多信息。


17
noatime应该是默认值。
Alex Chamberlain 2012年

3
@AlexChamberlain:noatime不是默认值,至少在Arch上不是。
Jivings 2012年

20
它是最新的Raspian版本。
奥利2012年

4
据此:superuser.com/a/168126/105936,将/var/tmp其存储在内存中并不是一个好主意。也许你把它弄糊涂了/tmp
inf3rno

1
请注意,如果noatime引起问题,您也可以使用relatime它来显着减少读取时的磁盘写入,而不是完全删除它们。
Mark Booth

79

如果您的应用程序无法使用Jivings提供的选项,那么可以延长其寿命的另一种选择是使用比您需要的容量大得多的SD卡。

留出足够的可用空间

大多数体面的SD卡都使用损耗均衡算法来最大程度地减少每个块的写入次数,因此,如果SD卡大于您的需要,损耗会散布在更大的可用空间区域中。

损耗均衡如此重要的部分原因是,某些文件系统(例如FAT(许多SD卡的默认格式))会反复敲击相同的扇区。

有关此问题的更多信息,请参见问题的答案。SD / MMC卡是否确实与自己的控制器磨损成水平?电子堆栈交换上,特别是这个答案

这个答案的一个有趣的统计数据是

拿一张2GB的卡并一次又一次地写完,在该卡失效且不再可写之前,平均大约需要10TB。

但令人担忧的是

SD卡不会在数据损坏时通知您,即不会像PC硬盘那样返回I / O错误。

如果您需要保证可靠的存储,那么这可能会使文件系统的选择很重要。

最后一点:将SD卡的容量加倍可能会使其寿命延长一倍以上

也就是说,如果您有2 GB的SD卡具有200 MB的可用空间,那么切换到4 GB的存储卡将为您提供11倍的可用空间,磨损均衡能力和使用寿命,而切换到16 GB的存储卡将为您提供71倍的可用空间空间。


为了首先让SD卡执行耗损均衡,需要告知哪些块实际上可以免费使用。fstrim可以这样做。
JimmyB

不需要修剪,但没有修剪,仅当OS重用块时(而不是停止使用块时),块才被重用。据我所知,trim是一种SSD功能,SD卡不支持该功能,而SD卡可以通过更简单的协议进行访问。
Mark Booth

@Mark,您的第一点完全正确。-关于第二点,MMC_ERASE仅出于此目的,在MMC / SD标准中的某处定义了(可选)命令。尽管我尝试过所有SD卡,但实际上仅支持其中一种(Pi随附的SD卡)。
JimmyB 2014年

在这种情况下,分区大小重要吗?我的意思是,如果我有一个16GB的卡和一个具有4GB唯一ext4分区的系统,它还会利用剩余的12GB进行损耗均衡吗?
natenho

对于磨损平衡良好的SD卡,很难告诉@natenho是,对于实施较差(或没有)的SD卡,很难告诉@natenho。
Mark Booth 2015年

25

我唯一看到的是不交换SD卡。

交换SD卡可能会杀死您的SD卡。

如果需要更多的RAM,可以尝试使用zram,http: //raspberry.pi.gw.gd/t50-Using-ZRAM.html上有一篇文章,提供了有关在树莓派上使用ZRAM的一些详细信息

有关zram的更多信息,请访问http://en.wikipedia.org/wiki/ZRam

另外,最新的SD卡比旧的SD卡更坚固,购买全新的Class 10 SD卡可能是一个不错的选择,因为您希望它能长时间使用。


14

您可以尝试运行完全位于ram的Puppy Linux。它非常小巧,速度极快,因为它可以通过在启动时将存储映像(在您的情况下为SD卡上)复制到RAM中,然后定期将更改刷新回存储中来完全在内存中运行。此保存的频率由用户控制,包括手动控制。

Puppy将分层的aufs或更旧的unionfs文件系统与任何标准Linux文件系统(例如ext3或ext4)一起使用。它也可以驻留在FAT或NTFS分区上。

至少有几个专门为RPi设计的Puppy版本,其中一个由“ Puppy Master” Barry Kauler创建。

有关更多信息,请访问http://puppylinux.org/wikka/Puppi


12

大多数人在这里谈论他们的假设,而不是个人经验。

我一直将带有RasPBX的RaspberryPi用作具有8个扩展名和传真的公司总机。通过LinkSYS SPA3000,我们有3个基于IP的中继和一条固定电话。我最初的金士顿4 GB SD卡仅用了一个月就咬了灰尘。

我仍在尝试,没有备份。顺便说一句,Pi已连接到APC UPS。然后,我从头开始重新设置了整个RasPBX,但是这次我将/ var / log和/ var / lib / mysql移到了我们的公司NAS。3个月后,此SD仍然正常。

然后我们有一个非常炎热的夏天。在第三个月中,pi开始没有突然检测到以太网。然后有一天,我发现所有的LED都暗淡了,无法启动。

我用开箱即用的Pi取代了Pi。降温后,乱序开始工作,但是它工作起来很不稳定,并且当它启动到RasPBX时,视频模式不会切换到图形,而是停留在80 * 25文本格式。真的搞砸了。从那以后,我已经订购了一套散热器。现在,新版Pi可以使用它超过2个月的7/24。

因此,如果要在7/24环境中使用pi,请不要便宜-购买散热器,并避免在SD卡上使用/ var / log和其他繁忙目录。


确保var / log在合适的设备上听起来像是很好的建议。在最初有问题的月份中,出于兴趣,您是否也将语音信箱存储在USD卡上?我只是想知道,如果我决定启用语音信箱,那么高耐用性的uSD卡(例如为Dash Cam使用的卡)是否会更好地适合我的RasPBX部署。
Mark Booth

11

我已经比较了所有使用utilitze TMPFS的解决方案,最好的答案是综合了脚本prepare-dirs(请参阅http://grenzdebiel.dyndns.org/wordpress/?p=98)和适当的/ etc / defaults / tmpfs( (请参阅http://www.a-netz.de/2013/02/ramdisks-for-the-raspberry/)。

要在树莓派上执行的必要步骤是:

1.编辑/etc/default/tmpfs并设置

RAMLOCK=yes
RAMSHM=yes
RAMTMP=yes

我建议以下尺寸:

TMPFS_SIZE=10%VM
RUN_SIZE=10M
LOCK_SIZE=5M
SHM_SIZE=10M
TMP_SIZE=25M

2.使用/ etc / fstab启用其他目录

tmpfs   /var/log                tmpfs   size=20M,defaults,noatime,mode=0755 0 0 
tmpfs   /var/cache/apt/archives tmpfs   size=100M,defaults,noexec,nosuid,nodev,mode=0755 0 0
tmpfs   /var/spool/cups         tmpfs   size=100M,defaults,noatime,mode=0755 0 0
tmpfs   /var/spool/cups/tmp     tmpfs   defaults,noatime,mode=0755 0 0

3.使用脚本/etc/init.d/prepare-dirs在其中创建缺少的目录,/var/log以便所有守护程序启动

最后查看其中包含的内容。

4.使脚本可执行chmod 755 /etc/initd/prepare-dirs

5.确保在启动守护程序之前先在启动时启动脚本: update-rc.d prepare-dirs defaults 01 99

的内容/etc/init.d/prepare-dir

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          prepare-dirs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create needed directories on /var/log/ for tmpfs at startup
# Description:       Create needed directories on /var/log/ for tmpfs at startup
### END INIT INFO
# needed Dirs
DIR[0]=/var/log/lighttpd
DIR[1]=/var/log/cups
DIR[2]=/var/log/apt
DIR[3]=/var/log/ConsoleKit
DIR[4]=/var/log/fsck
DIR[5]=/var/log/news
DIR[6]=/var/log/ntpstats
DIR[7]=/var/log/samba
DIR[8]=/var/log/lastlog
DIR[9]=/var/log/exim
DIR[10]=/var/log/watchdog
case "${1:-''}" in
  start)
        typeset -i i=0 max=${#DIR[*]}
        while (( i < max ))
        do
                mkdir  ${DIR[$i]}
                chmod 755 ${DIR[$i]}
                i=i+1
        done
        # set rights
        chown www-data.www-data ${DIR[0]}
    ;;
  stop)
    ;;
  restart)
   ;;
  reload|force-reload)
   ;;
  status)
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac

而已。


Puppy Linux也将TMPFS用于所有内容。
DocSalvager 2015年

7

禁用交换文件:

sudo dphys交换文件交换

无需卸载,但是,如果您不使用它并且想要空间,则可以安全地删除它。备用命令删除:

sudo dphys-swapfile卸载

用法:/ sbin / dphys-swapfile {setup | swapon | swapoff | uninstall}


5

闪光灯耐力:

  • 对于多层单元(MLC)闪存,每个物理扇区最多10,000个写入周期。
  • 对于单级单元(SLC)闪存,每个物理扇区最多100,000个写入周期。
  • 较新的SSD每个物理扇区提供100万个写周期。

在大卡和正常磨损情况下,这纯粹是数学上的事情。如果您要日夜不停地写入8GB MLC型闪存卡,则大约需要30天才能将其杀死。

Techsnap上的第99集谈到了SSD的磨损,艾伦(Allen)解释了如何在日常使用中不可能磨损SSD,并且我们不必担心禁用交换,克隆和其他所有功能。现在就可以使用!智能磨损平衡功能可以处理所有问题。

金士顿(Kingston)引用的正常穿着将使您在专业数码相机中拥有27年的使用寿命。

对于普通的数码单反相机,您可能每几个月将其装满一次。.取决于您旅行的时间。考虑到Pi,如果您尝试分配内存并经常刷新,则可能要付出更大的代价。通常,一旦您对发行版感到满意...几个月或几年后都不会重新刷新。因此,要延长SD的磨损,最好遵循一些建议,以减少SD上的IO。

闪存的价格下降了,技术也更好了。

大多数SD卡的寿命将超过两代或三代设备,到那时,它将被视为体积太小,使用速度太慢且无法提供更好,更便宜的升级版本!


出于安全目的而设置了网络摄像头的Raspberry Pi可能正在24/7写入数据。我想在这种情况下,固态硬盘可能更好。
高度不规则

1
是的,但不是在整个时间内依次写入所有扇区。对其进行了最少的磨损管理,并且新数据始终进入最少的访问扇区/区域。该视频不会覆盖文件系统文件或页面文件。迷恋16GB闪存驱动器可以使用几个小时?通常,央视应在15-30天后访问!请改用1 TB驱动器或NAS进行存储以用于历史记录。即使是短期的存储和转让,您也可以从SD卡中节省数年!最好还是使用32gb SD,但将文件夹的大小限制为16GB-使用该技术后,您的使用寿命将增加一倍以上!
Piotr Kula

4
@ppumkin,能否请您告诉我们您实际如何在RPi中使用SD卡?尽管供应商数量令人印象深刻,但我们中的许多人(Google“树莓损坏的sd”)在默认Raspbian设置下都遇到了致命故障(我不止一个,包括金斯敦,现在已经提到)。 SD,但是您的论文数据仍然没有得到证实,没有提及(我应该说是众所周知的)RPi SD问题,您自己的实际实践,或者更好的是:案例研究实验性地揭穿了SD损害“谣言”。
Sz。

1
看,我谈论的所有内容都链接到参考。好的,您想知道我如何使用它吗?我不!因为Pi,真是个大屁股痛!SD卡不断出现故障,而不是SD卡出现故障。Pi硬件或软件正在使这些事情变砖砌。我认为这是廉价USB电源提供的不稳定电压。新的B +上装有调节器。感谢上帝!这个固定的WiFi,声音反馈,我向上帝祈祷SD卡。我仍然需要订购一些,但是我现在正在与Netduino一起玩,还没有SD崩溃。
Piotr Kula 2014年

1
@ppumkin我使用了SanDisk。不是ebay的。刷新SD卡(例如,在相机中重复使用)和将其用作操作系统的宿主之间有很大的区别。你应该更具体指出到底如何,你用你的,能维持多久持续。我不需要重复Lunakids的评论,但我完全同意他(她)的意见。。
RolfBly 2015年

4

如前所述,主要问题是文件和目录,在重新启动之间不值得保存,但是经常写入,例如,缓存文件,下载文件夹等。

Raspbian以及Debian和Ubuntu都有一个名为unburden-home-dir的软件包,其主要目的是将此类文件符号链接到一个问题较小的位置,例如tmpfs,不易磨损的安装或外部硬盘。

它通常在登录时在X下运行,并以GUI应用程序的缓存文件为目标,但是也可以从脚本等中调用,并针对用户主目录中的任意文件进行配置。


3

这些是我对Debian 8.0(Jessie)的建议

它们基于iotop -bktoqqqiostat -dzp 5。您应该首先运行这些命令以了解问题及其解决方案。

1.禁用交换

sudo systemctl disable dphys-swapfile
sudo rm /var/swap

2.使用安装选项和RAM

使用noatime,commit=1800选项将SD卡上的所有分区挂载,并使用以下条目将以下目录安装到RAM /etc/fstab/

/dev/mmcblk0p1  /boot           vfat    defaults,noatime,commit=1800  0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime,commit=1800  0       1

tmpfs           /tmp            tmpfs   size=50M,nodev,nosuid     0       0
tmpfs           /var/tmp        tmpfs   size=10M,nodev,nosuid     0       0
tmpfs           /var/cache/samba tmpfs   size=5M,nodev,nosuid     0       0

提交将延迟写入并首先收集它们。

3.将最频繁的日志文件记录到 /var/tmp/log/

请参阅我的描述如何减少对日志文件的写入

4.阻止Chromium重击SD卡

事实证明铬严重写和不能停止(见17672752663)。这会影响缓存和用户数据目录。该铬/提示和技巧讲解如何可以移动到RAM中。由于Raspberry没有太多的RAM,建议的Tab Suspender对于节省RAM很有用。

a)缓存

限制高速缓存大小和编辑它移动到内存/etc/chromium-browser/customizations/00-rpi-vars

CHROMIUM_FLAGS="--disable-quic --enable-fast-unload --enable-tcp-fast-open --disk-cache-size=10000000 --media-cache-size=5000000"

现在,缓存已足够小,可以通过将XDG_CACHE_HOME条目更改/etc/security/pam_env.conf

XDG_CACHE_HOME  DEFAULT=/tmp/@{PAM_USER}/cache

现在,我的两个用户在RAM中有一个小的浏览器缓存。如果这还不足以根据需要更改缓存或/ tmp /大小。

b)用户数据目录

此外,用户数据目录(.config/chromium/)也会进行大量写入操作。Chromium / Tips和小技巧建议使用Profile-sync-daemon。它旨在管理tmpfs中浏览器的配置文件,并定期将其同步回物理磁盘。不幸的是,该软件包尚未成为Raspbian 8.0(Jessie)发行版的一部分。因此,我尚未对此进行测试。

5. SD卡上的可用空间

通过卸载不需要的软件包和文件来释放空间。这样可以使磨损更加均匀地分布在各个分区上。

做完了!

现在再次运行iotop -bktoqqqiostat -dzp 5发现系统空闲时写入访问量显着减少。几分钟没有任何内容写入磁盘。不用担心绿色的ACT LED闪烁。显然,这不是一个好的写访问指示器。


2

通过将syslog输出流式传输到另一台服务器,可以仅略微减少写入周期。当然,具有syslogd运行中的这样的服务器是前提条件。但是,由于Pi是Linux发烧友的玩具,所以这种情况很可能经常发生。:-)

要激活此流,只需插入如下语句

*.*    @myserver.mydomain

在文件顶部的顶部/etc/rsyslog.conf,注释掉所有其他行,然后通过发出来重新启动日志记录service rsyslog restart。此后,消息应进入所选服务器。

一个明显的好处是,您可以轻松地与同一服务器上的其他计算机一起监视Pi。缺点之一是,在系统启动和关闭期间,如果尚未建立网络连接或已经关闭网络连接,则可能会丢失一些消息。


请注意,现代Linux系统(包括CentOS 7和Debian 8以及基于Raspbian 8的系统)会进行所有日志记录,journald并将它们存储在systemd日志中。它们还配置journald为将日志转发到rsyslogd正在监听的syslog套接字。会将邮件的其他副本放置在的日志文件中/var/log。如果您习惯于journalctl浏览日志(它的工作原理比/var/log您一次熟悉的要好得多),则可以完全禁用rsyslog并保存一些写操作。
Curt J. Sampson

1

注意:100,000个周期的限制是适用于每个计算设备的一个假设,即使是键盘上的键也是如此。

同样,这可能会增强我的上述观点。

除了用户Pi [default]之外,添加一个新用户。将新用户的主目录指向外部驱动器[thumb / hard drive]。向新用户授予超级用户权限,并开始将其用作您的主帐户。

我希望这有帮助..


我总是尽量少打字以节省键盘;)
Piotr Kula

添加新用户不会阻止您忙碌/var/log/var/tmp。同样,从经验获得证据表明适当的冷却会有所不同,这比说“我相信”要好得多。
RolfBly

0

使用busybox的syslog守护程序(在Raspbian / Debian / Ubuntu上的busybox-syslogd软件包中),而不是默认的syslog守护程序(通常是rsyslog)。默认情况下,在Raspbian / Debian / Ubuntu上,busybox的syslogd仅登录到内存中的环形缓冲区,而不登录到磁盘。默认情况下,环形缓冲区的大小为128kB,即旧的日志条目很快就会转出然后消失了。但是您可以配置它以使用更多的RAM。

但是,这是一个比根本没有syslog守护程序更好的解决方案,即您仍然可以登录并读取大约的日志条目。过去几个小时或几天(取决于环形缓冲区的配置大小)logread。您还可以使用logread -f获得tail -f类似的行为,例如使用过滤器脚本只能存储感兴趣的日志条目,或者使用转发记录在网络上其他地方的项目,如stunnel或这样的。


-1

我做了几件事:

dphys-swapfile的chmod(在/ etc中的某个位置-目前不在PI附近):

sudo chmod a-x dphys-swapfile

我在启动时遇到小错误(无法启动dphys-swapfile服务)-假设有更好的方法... rc-update?

另外,我从相机模块捕获图像,最终将其放置在Web服务器(Pi)上。我将/ dev / ram0格式化为ext2,将其安装为/ media / ramdrive(我认为使用/etc/init.rc)。它的大小为4兆,足以一击。不写入SD。

服务器(oululife.dnsdynamic.com)是实验性的,但可以在Web上使用。为了真正强调这一点,我让它还播放了“ Heartbeat *”的MP4情节。它运行lighttpd,Mysql,PHP,WordPress,甚至当我远程通过网络流式传输时,它几乎也不会冒汗,平均负载约为0.2。根本没有超频。B型转速 2,上升24/7。因此,如果我可以将日志文件放入其他15个/ dev / ramX中,我认为我的Micro-SD 16G卡将使用几年。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.