как стереть свободное место на диске в linux?

<p>когда файл удален, его содержимое все равно может остаться в файловой системе, если явно не перезаписано чем-то другим. команда <code>wipe</code> может безопасно удалять файлы, но, похоже, не позволяет стереть свободное дисковое пространство, не используемое никакими файлами.</p><p>что я должен использовать для достижения этой цели?</p>

<p><strong> <em>warning:</em> </strong><em>современное оборудование для дисков/ssd и современные файловые системы могут спрятать данные в местах, где вы не можете их удалить, поэтому этот процесс все равно может оставить данные на диске. безопасные способы удаления данных - команда безопасного удаления ata (если она реализована правильно) или физическое уничтожение. также см. <a href="https://security.stackexchange.com/questions/5749/how-can-i-reliably-erase-all-information-on-a-hard-drive">как надежно удалить всю информацию на жестком диске?</a> </em></p><p>вы можете использовать набор инструментов, который называется secure-delete.</p><pre><code>sudo apt-get install secure-delete </code></pre><p>это имеет четыре инструмента:</p><p><code>srm</code> - безопасно удалить существующий файл<br> <code>smem</code> - безопасно удалить следы файла из оперативной памяти<br> <code>sfill</code> - очистить все пространство, помеченное как пустое на вашем жестком диске<br> <code>sswap</code> - стереть все данные из пространства подкачки.</p><p>со страницы руководства <code>srm</code></p><blockquote> <p>srm предназначен для безопасного удаления данных на носителях, которые не могут быть восстановлены ворами, правоохранительными органами или другими угрозами. алгоритм очистки основан на статье «безопасное удаление данных из магнитной и твердотельной памяти», представленной на 6-м симпозиуме по безопасности usenix питером гутманом, одним из ведущих гражданских криптографов.</p> <p>процесс безопасного удаления данных в srm выглядит следующим образом:</p> <ul> <li>1 проход с 0xff</li> <li>5 случайных проходов. <code>/dev/urandom</code> используется для безопасного rng, если доступно.</li> <li>27 проходов со специальными значениями, определенными питером гутманом.</li> <li>5 случайных проходов. <code>/dev/urandom</code> используется для безопасного rng, если доступно.</li> <li>переименуйте файл в случайное значение</li> <li>усекать файл</li> </ul> <p>в качестве дополнительной меры безопасности файл открывается в режиме o\_sync, и после каждого прохода выполняется вызов <code>fsync()</code>. <code>srm</code> для ускорения записывает 32 тыс. блоков, заполняя буферы дисковых кешей, заставляя их сбрасывать и перезаписывать старые данные, которые принадлежали файлу.</p> </blockquote>

<p>самый быстрый способ, если вам нужен только один проход и вы просто хотите заменить все на нули, это:</p><pre><code>cat /dev/zero > zero.file sync rm zero.file </code></pre><p>(запустить из каталога в файловой системе, которую вы хотите стереть)<br> <sub>(команда <code>sync</code> - это мера паранойи, которая обеспечивает запись всех данных на диск - интеллектуальный менеджер кэша может сработать, что он может отменить запись для любых ожидающих блоков, когда файл не связан)</sub></p><p>во время этой операции будет время, когда в файловой системе вообще не будет свободного места, которое может составить десятки секунд, если результирующий файл будет большим и фрагментированным, поэтому его удаление займет некоторое время. чтобы уменьшить время, когда свободное пространство полностью равно нулю:</p><pre><code>dd if=/dev/zero of=zero.small.file bs=1024 count=102400 cat /dev/zero > zero.file sync rm zero.small.file rm zero.file </code></pre><p>этого должно быть достаточно, чтобы кто-то не мог прочитать содержимое старого файла без дорогостоящей криминалистической операции. для более безопасного, но более медленного варианта замените <code>/dev/zero</code> на <code>/dev/urandom</code>. для большей паранойи выполните несколько шагов с <code>/dev/urandom</code>, хотя если вам нужно столько усилий, утилита <code>shred</code> из пакета coreutils - это то, что нужно:</p><pre><code>dd if=/dev/zero of=zero.small.file bs=1024 count=102400 shred -z zero.small.file cat /dev/zero > zero.file sync rm zero.small.file shred -z zero.file sync rm zero.file </code></pre><p>обратите внимание, что в приведенном выше примере маленький файл измельчается перед созданием большего, поэтому его можно удалить, как только завершится создание большего, вместо того, чтобы ждать, пока он будет уничтожен, оставляя файловую систему с нулевым свободным пространством на время, которое требуется. процесс уничтожения занимает <em>long</em> время для большого файла, и если вы не пытаетесь что-то скрыть от nsa, на самом деле imo не требуется.</p><p>все вышеперечисленное должно работать на любой файловой системе.</p><p><strong> ограничения размера файла: </strong></p><p>как отмечает danmoulding в комментарии ниже, это может иметь проблемы с ограничением размера файла в некоторых файловых системах.</p><p>для fat32 это было бы <em>определенно</em> проблемой из-за ограничения файла в 2 гб: большинство томов больше, чем сегодня (8tib - это ограничение размера тома iirc). вы можете обойти эту проблему, передав по конвейеру большие выходные данные <code>cat /dev/zero</code> через <code>split</code>, чтобы сгенерировать несколько файлов меньшего размера и соответственно настроить этапы уничтожения и удаления.</p><p>с ext2/3/4 это не так важно: при использовании стандартного/общего блока 4k ограничение размера файла составляет 2 тб, поэтому вам потребуется объем <em>огромный</em>, чтобы это стало проблемой ( максимальный размер объема в этих условиях составляет 16 тб).</p><p>с (все еще экспериментальными) btrfs максимальные размеры файлов и томов составляют огромные 16eib.</p><p>под ntfs максимальная длина файла в некоторых случаях даже превышает максимальную длину тома.</p><p>начальные точки для получения дополнительной информации:<br> <a href="http://en.wikipedia.org/wiki/ext3#size\_limits">http://en.wikipedia.org/wiki/ext3#size\_limits</a> <br> <a href="http://en.wikipedia.org/wiki/btrfs">http://en.wikipedia.org/wiki/btrfs</a> <br> <a href="http://en.wikipedia.org/wiki/ntfs#scalability">http://en.wikipedia.org/wiki/ntfs#scalability</a> </p><p><strong> виртуальные устройства </strong></p><p>как недавно упоминалось в комментариях, существуют дополнительные соображения для виртуальных устройств:</p><ul> <li> <p>для редко выделяемых виртуальных дисков другие методы, такие как используемые <code>zerofree</code>, будут быстрее (хотя в отличие от <code>cat</code> и <code>dd</code> это не стандартный инструмент, на который можно положиться в значительной степени в любой unix-подобной ос).</p> </li> <li> <p>имейте в виду, что обнуление блока на разреженном виртуальном устройстве может не стереть блок на базовом устройстве <em>физическом</em>, на самом деле я бы сказал, что это маловероятно - диспетчер виртуальных дисков просто сделает блок больше не используется, поэтому он может быть выделен для чего-то другого позже.</p> </li> <li> <p>даже для виртуальных устройств фиксированного размера вы не можете контролировать физическое расположение устройства, поэтому его можно перемещать вокруг текущего местоположения или на новый набор физических дисков в любое время, и самое большее, что вы можете стереть, это текущее местоположение, а не любые предыдущие местоположения, в которых блок мог находиться в прошлом.</p> </li> <li> <p>для перечисленных выше проблем на виртуальных устройствах: если вы не управляете хостами и не можете выполнить безопасную очистку их нераспределенного пространства после очистки дисков в vm или перемещения виртуального устройства, вам ничего не нужно может сделать это после свершившегося факта. единственным выходом является использование полного шифрования диска <em>с самого начала</em>, так что в первую очередь все незашифрованные данные записываются на физический носитель. конечно, все еще может потребоваться очистка свободного пространства в vm. также обратите внимание, что fde может сделать разреженные виртуальные устройства намного менее полезными, так как уровень виртуализации не может реально увидеть, какие блоки не используются. если уровень файловой системы ос отправляет команды обрезки на виртуальное устройство (как если бы это был ssd), и виртуальный контроллер интерпретирует их, то это может решить эту проблему, но я не знаю каких-либо обстоятельств, где это действительно происходит, и более широких обсуждение этого вопроса в другом месте (мы уже близки к тому, чтобы не обсуждать первоначальный вопрос, поэтому, если это вызвало у вас интерес, возможно, стоит поэкспериментировать и/или последующие вопросы).</p> </li> </ul>

<h2>предупреждение</h2><p>я был шокирован тем, сколько файлов <a href="http://www.cgsecurity.org/wiki/photorec">photorec</a> может извлечь с моего диска, даже после очистки.</p><p>вопрос о том, будет ли больше безопасности при заполнении «свободного пространства» только один раз 0x00 или 38 раз различными каббалистическими стандартами, является скорее академической дискуссией. автор оригинальной статьи 1996 года о измельчении написал себе <a href="http://www.cs.auckland.ac.nz/~pgut001/pubs/secure\_del.html#epilogue">epilogue</a> , сказав, что это устарело и не нужно для современного оборудования. нет зарегистрированного случая, когда данные физически заменяли нули и впоследствии восстанавливались.</p><p>истинная<strong> хрупкая ссылка </strong>в этой процедуре -<strong> файловая система </strong>. некоторые файловые системы резервируют пространство для специального использования, и оно не доступно как «свободное место».<strong> но ваши данные могут быть там </strong>. это включает в себя фотографии, личные текстовые электронные письма, что угодно. я только что гуглил зарезервировано + пробел + ext4 и узнал, что 5% моего раздела <code>home</code> были зарезервированы. я предполагаю, что именно здесь <code>photorec</code> нашел так много моих вещей. вывод:<strong> метод измельчения не самый важный, даже многопроходный метод все еще оставляет данные на месте </strong>.</p><p>вы можете попробовать <code># tune2fs -m 0 /dev/sdn0</code> перед его монтированием. (если это будет корневой раздел после перезагрузки, обязательно запустите <code>-m 5</code> или <code>-m 1</code> после его размонтирования).</p><p>но, тем не менее, так или иначе, может остаться место.</p><p>единственный действительно безопасный способ - стереть весь раздел, снова создать файловую систему, а затем восстановить файлы из резервной копии.</p><hr><p><strong> быстрый путь (рекомендуется) </strong></p><p>запустите из каталога в файловой системе, которую вы хотите стереть:</p><pre><code>dd if=/dev/zero of=zero.small.file bs=1024 count=102400 dd if=/dev/zero of=zero.file bs=1024 sync ; sleep 60 ; sync rm zero.small.file rm zero.file </code></pre><p><em>примечания: цель небольшого файла - сократить время, когда свободное место полностью равно нулю; цель синхронизации - убедиться, что данные действительно записаны.</em></p><p>это должно быть достаточно хорошо для большинства людей.</p><p><strong> медленный путь (параноик) </strong></p><p>не зарегистрировано случаев восстановления данных после вышеуказанной очистки. это было бы дорого и требовательно к ресурсам, если вообще возможно.</p><p>тем не менее, если у вас есть основания полагать, что секретные агентства потратят много ресурсов на восстановление ваших файлов, этого должно быть достаточно:</p><pre><code>dd if=/dev/urandom of=random.small.file bs=1024 count=102400 dd if=/dev/urandom of=random.file bs=1024 sync ; sleep 60 ; sync rm random.small.file rm random.file </code></pre><p>это занимает гораздо больше времени.</p><p>предупреждение. если вы выбрали параноидальный способ, после этого вы все равно захотите сделать быструю очистку, и это не паранойя. наличие чисто случайных данных легко и дешево обнаружить, и возникает подозрение, что это фактически зашифрованные данные. вы можете умереть под пытками за то, что не раскрыли ключ расшифровки.</p><p><strong> очень медленный путь (сумасшедший параноик) </strong></p><p>даже автор оригинальной статьи 1996 года о измельчении написал эпилог, в котором говорится, что это устарело и не нужно для современного оборудования.</p><p>но если у вас еще есть много свободного времени, и вы не возражаете тратить свой диск на перезапись, то это так:</p><pre><code>dd if=/dev/zero of=zero.small.file bs=1024 count=102400 sync ; sleep 60 ; sync shred -z zero.small.file dd if=/dev/zero of=zero.file bs=1024 sync ; sleep 60 ; sync rm zero.small.file shred -z zero.file sync ; sleep 60 ; sync rm zero.file </code></pre><p><em>примечание: это по сути эквивалентно использованию инструмента безопасного удаления.</em></p><hr><p>перед редактированием этот пост был переписан дэвидом спиллеттом. команда "cat" выдает сообщение об ошибке, но я не могу писать комментарии к постам других людей.</p>

<p>по крайней мере, в ubuntu есть нулевая утилита:</p><p> <a href="http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html">http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html</a> </p><pre><code> zerofree — zero free blocks from ext2/3 file-systems zerofree finds the unallocated, non-zeroed blocks in an ext2 or ext3 filesystem (e.g. /dev/hda1) and fills them with zeroes. this is useful if the device on which this file-system resides is a disk image. in this case, depending on the type of disk image, a secondary utility may be able to reduce the size of the disk image after zerofree has been run. the usual way to achieve the same result (zeroing the unallocated blocks) is to run dd (1) to create a file full of zeroes that takes up the entire free space on the drive, and then delete this file. this has many disadvantages, which zerofree alleviates: · it is slow; · it makes the disk image (temporarily) grow to its maximal extent; · it (temporarily) uses all free space on the disk, so other concurrent write actions may fail. filesystem has to be unmounted or mounted read-only for zerofree to work. it will exit with an error message if the filesystem is mounted writable. to remount the root file-system readonly, you can first switch to single user runlevel (telinit 1) then use mount -o remount,ro filesystem. </code></pre><p>также проверьте эту ссылку на zerofree: <a href="http://intgat.tigress.co.uk/rmy/uml/index.html">хранение изображений файловой системы редкими</a> - это от ее автора - рон йорстон (9 августа 2012)</p>

<p>вот как это сделать с помощью графического интерфейса.</p><ol> <li>установить <a href="http://bleachbit.sourceforge.net/">bleachbit</a> </li> <li>запустите от имени пользователя root, выбрав приложения - системные инструменты - bleachbit от имени администратора.</li> <li>в настройках укажите, какие пути вы хотите. как правило, он угадывает их хорошо. вы хотите включить один доступный для записи путь для каждого раздела. обычно это/home/username и/tmp, если они не являются одним и тем же разделом, в этом случае просто выберите один.</li> <li>установите флажок система - wipe free disk space.</li> <li>нажмите удалить.</li> </ol><p>преимущество bleachbit перед dd (что в противном случае очень приятно) заключается в том, что когда диск, наконец, заполнен, bleachbit создает небольшие файлы для очистки inode (которые содержат метаданные, например имена файлов и т.д.).</p>

<p>вы можете стереть свое свободное место с помощью безопасного пакета удаления.</p><p>в этом пакете вы можете найти инструмент <code>sfill</code>, который предназначен для безопасного удаления данных, находящихся на доступном дисковом пространстве на носителях, которые не могут быть восстановлены ворами, правоохранительными органами или другими угрозами.</p><p>чтобы установить пакет безопасного удаления в linux (ubuntu), установите его с помощью следующей команды:</p><pre><code>$ sudo apt-get install secure-delete затем, чтобы<strong> стереть </strong>в ваших данных нет свободного места, попробуйте следующую команду:sfill -f -v -ll /your_mountpoint/or_directory где/your_mountpoint/or_directory - это точка монтирования (df -h, mount) или каталог для удаления свободного места.прочтите руководство по адресу <a href="http://manpages.ubuntu.com/manpages/hardy/man1/sfill.1.html">http://manpages.ubuntu.com/manpages/hardy/man1/sfill.1.html 

протрите диск на максимальной скорости.типичные инструкции для шифрования диска в настоящее время скажут вам сначала очистить диск.команда ниже заполнит ваш диск зашифрованным текстом aes.используйте live cd, если вам нужно стереть основной загрузочный диск.откройте терминал и повышайте свои привилегии:sudo bash давайте перечислим все диски в системе для безопасности:cat /proc/partitions примечание. замените /dev/sd{x} на устройство, которое вы хотите стереть.внимание: это не для любителей! вы можете сделать вашу систему не загружаемой !!!sudo openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > /dev/sd{x} </code></pre><p>я ошеломлен тем, как быстро это происходит.</p>

<p>я использую <code>dd</code>, чтобы выделить один или несколько больших файлов для заполнения свободного места, а затем использую утилиту безопасного удаления.</p><p>чтобы разместить файлы с помощью dd, попробуйте:</p><pre><code>dd if=/dev/zero of=delete\_me bs=1024 count=102400 </code></pre><p>это создаст файл с именем <code>delete\_me</code> размером 100 мб. (здесь <code>bs</code> - это «размер блока», установленный в 1k, а <code>count</code> - это количество блоков для выделения.)</p><p>затем используйте вашу любимую утилиту безопасного удаления (я использую <a href="http://linux.about.com/library/cmd/blcmdl1\_shred.htm"><code>shred</code></a> ) для созданных файлов.</p><p><strong> но обратите внимание: </strong>буферизация означает, что даже если вы делаете диск <em>целый</em>, вы можете получить не все!</p><hr><p>эта <a href="http://www.slac.stanford.edu/comp/unix/secure-erase.html">ссылка</a> рекомендует <a href="http://code.google.com/p/diskscrub/"><code>scrub</code></a> для очистки свободного пространства. не пробовал это.</p>

<p>возможно, в вашей системе уже установлен пакет <a href="http://www.gnu.org/software/coreutils/coreutils.html">gnu coreutils</a> . он предоставляет команду <a href="http://www.gnu.org/software/coreutils/manual/html\_node/shred-invocation.html">shred</a> .</p>

<p>проще использовать <a href="https://github.com/chaos/scrub">скраб</a> :</p><pre><code>scrub -x dump </code></pre><p>это создаст папку <code>dump</code> в текущем местоположении и будет создавать файл, пока диск не будет заполнен. вы можете выбрать шаблон с параметром <code>-p</code> (<code>nnsa|dod|bsi|old|fastold|gutmann</code>).</p><p>установить скраб нелегко ( <a href="http://ubuntuforums.org/showthread.php?t=333309">см. раздел «форумы ubuntu» в этом разделе</a> ), но как только установка будет завершена, в вашей руке будет действительно простой и эффективный инструмент.</p>

<p>я нашел простое решение, которое работает на linux и macos. переместитесь в корневую папку вашего диска и запустите эту команду:</p><pre><code>for i in $(seq 1 //diskspace//); do dd if=/dev/zero of=emptyfile${i} bs=1024 count=1048576; done; rm emptyfile*; </code></pre><p>где // diskspace // - размер вашего жесткого диска в гб.</p>

<p>используйте dd и просто обнулите свободное место. это миф, данные должны быть перезаписаны несколько раз (просто спросите питера гантмана) и случайные данные, в отличие от 1, то 0 означает неестественную активность. тогда конечный результат - чистый диск с меньшим количеством времени, потраченным на запись. кроме того, программы безопасного удаления не могут гарантировать, что они даже перезаписывают реальный файл в современных файловых системах (в журнале). сделайте себе одолжение и получите фоторепортаж, отсканируйте свой диск, чтобы увидеть беспорядок, вытрите его 1 и, возможно, нулями, чтобы он выглядел нетронутым. если photorec все еще находит что-то, помните, что он сканирует все доступное, поэтому сделайте это снова с пользователем root.</p><p>помните, что у cia/fbi/nsa нет необычной машины, которая может считывать фактическое состояние ваших битов магнитных носителей. это была всего лишь статья, написанная давным-давно. «что-если». вам нужно только стереть 1 раз.</p>

<p>вот сценарий "sdelete.sh", который я использую. смотрите комментарии для деталей.</p><pre><code># install the secure-delete package (sfill command). # to see progress type in new terminal: # watch -n 1 df -hm # assuming that there is one partition (/dev/sda1). sfill writes to /. # the second pass writes in current directory and synchronizes data. # if you have a swap partition then disable it by editing /etc/fstab # and use "sswap" or similar to wipe it out. # some filesystems such as ext4 reserve 5% of disk space # for special use, for example for the /home directory. # in such case sfill won't wipe out that free space. you # can remove that reserved space with the tune2fs command. # see http://superuser.com/a/150757 # and https://www.google.com/search?q=reserved+space+ext4+sfill sudo tune2fs -m 0 /dev/sda1 sudo tune2fs -l /dev/sda1 | grep 'reserved block count' sudo sfill -vfllz / # sfill with the -f (fast) option won't synchronize the data to # make sure that all was actually written. without the fast option # it is way too slow, so doing another pass in some other way with # synchronization. unfortunately this does not seem to be perfect, # as i've watched free space by running the "watch -n 1 df -hm" # command and i could see that there was still some available space # left (tested on a ssd drive). dd if=/dev/zero of=zero.small.file bs=1024 count=102400 dd if=/dev/zero of=zero.file bs=1024 sync ; sleep 60 ; sync rm zero.small.file rm zero.file sudo tune2fs -m 5 /dev/sda1 sudo tune2fs -l /dev/sda1 | grep 'reserved block count' </code></pre>

<p><em> это не ответ! </em>просто комментарий для тех, кто хочет использовать <code>pv</code>..., так что не беспокойтесь о голосовании.</p><p>на<strong> linux mint 17.3 </strong>вы можете использовать <code>pv</code> (<em> представление канала </em>), чтобы получить прогресс написания. например:</p><pre><code># install pv (pipe view) sudo apt-get install pv # write huge file of approximate size of /dev/sdb, using urandom data: pv --timer --average-rate --progress --numeric --eta --interval 5 --size "$(blockdev --getsize64 /dev/sda )" /dev/urandom >rand.file преимущество здесь в том, что вы получаете индикатор выполнения, eta и постоянно обновляемую скорость передачи данных. недостатком является то, что это записано в одну строку, а когда диск заполнен (возвращает ошибку), он исчезает. это происходит потому, что полный размер является приблизительным, поскольку ос, вероятно, будет использовать диск во время этой очень длительной операции, особенно на томе ос.на очень старом hd я получаю скорость передачи данных около<strong> 13 мб/с </strong>с использованием /dev/urandom и около<strong> 70 мб/с </strong>при использовании /dev/zero. это, вероятно, будет улучшаться при использовании необработанных dd или cat, а не pv.

я иногда использую этот bash one-liner:while :; do cat /dev/zero > zero.$random; done </code></pre><p>когда он начинает говорить, что диск заполнен, просто нажмите <kbd>ctrl</kbd>+<kbd>c</kbd> и удалите созданные файлы <code>zero.*</code>.</p><p>он работает в любой системе, независимо от размера файла.<br> игнорировать любые ошибки <code>cat: write error: file too large</code>.</p>