Файлы сохраняются на диске последовательно?

Есть ли способ выключить ПК через диалоговое окно (например, «Вы хотите выключить?» [Да] [Нет] )?

Я считаю, что самый простой способ сделать это - через xmessage . Примерно так:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0

xmessage -timeout 10 "Shutdown computer?" -buttons yes:0,no:1

case $? in
    0)  
    echo "Shutting down..."
    #systemctl poweroff
    ;;  
    1)  
    echo "Ok."
    ;;  
    *)  
    echo "Mystic error!"
    ;;  
esac

Я добавил переменные $ PATH и $ DISPLAY , чтобы их можно было использовать в cron (подробнее об этом здесь ). И, конечно, если вы хотите, чтобы выключил ваш компьютер, вам придется раскомментировать эту строку, и, конечно, вы также можете удалить операторы echo . Я просто быстро собрал это как образец.

Суть: Когда пользователь нажимает да , возвращается код 0 , и компьютер выключается. Если пользователь нажимает, нет , код возврата - 1 , затем выполните , а не выключение. (Изменить :) Если ни один пользователь не нажмет какую-либо кнопку после тайм-аута секунд (в данном случае 10 ), xmessage выйдет с 0 и компьютер выключится.

При запуске скрипт создает следующее маленькое диалоговое окно:

https://s22.postimg.org/irl97w835/xmessage.png

Я уверен, что zenity отлично подходит, но для такой простой задачи, как эта, я думаю, что xmessage может быть проще всего. .

22
15.02.2017, 04:27
5 ответов

Если это всего лишь одноразовая вещь и не важно, как файл изначально хранится, важен только результат, тогда вы можете просто сохранить файл в обычном режиме, а затем запустить дефрагментатор вашей операционной системы. Затем вы можете проверить с помощью этот ответ , если ваш файл цел, если нет, повторите. Это самый простой способ сделать это без использования команд или внешних программ, но это, конечно, не самый быстрый метод, потому что он дефрагментирует весь ваш диск.

-1
27.01.2020, 19:42

Вы упоминаете разреженные файлы, и ни в одном из других ответов они не упоминаются.

Большинство файлов не являются разреженными. Самый распространенный способ создания файла - написать его весь за один раз, от начала до конца. Никаких дыр там нет.

Однако вы можете сказать: "Перейдите в позицию 1,000,000,000,000,000 и запишите туда байт". Это создаст файл, который выглядит так, как будто он имеет размер в этабайт, но на самом деле использует (вероятно) только 4k на диске. Это разреженный файл.

Вы можете делать это много раз для одного и того же файла, оставляя небольшие объемы данных, разбросанные по огромной пустоте.

Хотя это может быть полезно, есть два недостатка.

Первый заключается в том, что файл будет фрагментирован, о чем вы и беспокоились.

Второй заключается в том, что не все программы хорошо обрабатывают такие файлы. Например, некоторые программы резервного копирования будут пытаться создать резервную копию пустоты и тем самым создадут резервную копию, которая будет намного больше, чем нужно, возможно, слишком большой для носителя резервной копии.

6
27.01.2020, 19:42

Могу ли я каким-то образом контролировать последовательность файлов? Я хочу выделить файл размером 10 ГБ. Я хочу, чтобы он был на диске последовательно, а не разделен между разными смещениями.

Есть по крайней мере несколько способов добиться этого.

  1. Используйте файловую систему с большим количеством свободного места и предварительно выделите пространство (например, используйте маркер конца данных для конкретного приложения и добавляйте случайные данные, пока размер файла не достигнет 10 ГБ). Это не гарантирует получение нефрагментированных данных.

  2. Используйте сырую (необработанную) файловую систему вместо ext4 и т. Д. СУБД иногда делают это из соображений производительности. Компромисс заключается в том, что вам придется выполнять собственное кэширование / ведение журнала / восстановление и т. Д., Если это необходимо.

Случаи, когда это приносит много пользы, относительно редки - я бы сначала посмотрел в другом месте, чтобы оптимизировать производительность.


См. Также

Верно ли, что системы управления базами данных обычно обходят файловые системы?

2
27.01.2020, 19:42

Можно ли сохранить файл , а не последовательно на диске? Я имею в виду, что часть файла находится под физическим адресом X, а другая часть - под физическим адресом Y, который не близок к X + смещению).

Да; это известно как фрагментация файлов и не редкость, особенно с большими файлами. Большинство файловых систем выделяют пространство по мере необходимости, более или менее последовательно, но они не могут предугадать будущее поведение - поэтому, если вы напишете 200 МБ в файл, а затем добавите еще 100 МБ, есть ненулевой шанс, что оба набора данных будут храниться в разных областях диска (в основном, любая другая запись, для которой требуется больше места на диске, происходящая после первой записи и перед второй, может происходить между ними). Если файловая система близка к заполнению, ситуация обычно будет хуже: может не быть непрерывной области свободного пространства, достаточно большой, чтобы вместить новый файл, поэтому его придется фрагментировать.

Могу ли я как-то контролировать последовательность файлов? Я хочу выделить большой файл размером 10 ГБ. Я хочу, чтобы он был последовательным на диске и не разделялся между разными смещениями.

Вы можете сообщить файловой системе о целевом размере вашего файла при его создании; это поможет файловой системе оптимально хранить его.Многие современные файловые системы используют технику, известную как отложенное размещение, при которой расположение нового файла на диске рассчитывается как можно позже, чтобы максимизировать информацию, доступную при выполнении вычислений. Вы можете помочь в этом процессе, используя функцию posix_fallocate (3) , чтобы сообщить файловой системе, сколько всего дискового пространства должно быть выделено. Современные файловые системы будут пытаться выполнить это распределение последовательно.

По-разному ли он действует между разными типами?

Разные файловые системы ведут себя по-разному, да. Файловые системы на основе журналов, такие как NILFS2, не распределяют хранилище таким же образом, как файловые системы на основе экстентов, такие как Ext4, и это только один пример вариации.

41
27.01.2020, 19:42

Команда filefrag расскажет, как ваш файл физически хранится на вашем устройстве:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Если вы запишете файл за один проход, я предполагаю, что ваш файл не будет фрагментирован.

Справочная страница fallocate (1) довольно ясна:

fallocate используется для предварительного выделения блоков в файл. Для файловых систем , которые поддерживают системный вызов fallocate , это делается быстро путем выделения блоков и их пометки как неинициализированных, не требуя ввода-вывода для блоков данных. . Это намного быстрее, чем создавать файл, заполняя его нулями.

Начиная с ядра Linux v2.6.31, системный вызов fallocate поддерживается файловыми системами btrfs, ext4, ocfs2 и xfs.

Это последовательный? Система сначала попытается последовательно распределить блоки. Если не может, не предупредит.

18
27.01.2020, 19:42

Теги

Похожие вопросы