Есть ли способ узнать размер страницы SSD в Linux / Unix? Что такое «физический блок» в выводе fdisk?

Хотя другие ответили на ваш конкретный вопрос, я добавлю, что

if [ -n "$(echo $1 | grep '^-[0-9][0-9]*$')" ]; then 

Это неправильный способ проверить, соответствует ли строка обычному выражение по нескольким причинам:

  1. Вы не можете использовать echo для произвольных данных
  2. Оставление расширения параметра без кавычек $ 1 выше - это оператор split + glob.
  3. grep сопоставляет регулярное выражение не с полным вводом, а с каждой строкой ввода. Так, например, он вернет истину на foo \ n-0 \ nbar .
  4. Регулярное выражение может соответствовать нулевой длине, поэтому в общем случае неправильно проверять, производит ли grep какой-либо вывод (обратите внимание, что при подстановке команд удаляются завершающие символы новой строки). Лучше использовать grep -q и полагаться на статус выхода grep , а не на [, а также избегать подстановки команд.
  5. Обратите внимание, что команда grep может быть упрощена до grep -xE '- [0-9] +'

bash , ksh93 и zsh имеет специальный оператор для (расширенного) сопоставления регулярных выражений. Чтобы использовать его портативно и надежно для всех трех (и bash-3.1), синтаксис следующий:

re='^-[0-9]+$'
if [[ $1 =~ $re ]]; then
  echo matches
fi

yash и zsh также поддерживают:

if [ "$1" '=~' '^-[0-9]+$' ]; then
  echo matches
fi

Стандартная команда для сопоставления строковых (базовых) регулярных выражений - expr :

if expr " $1" : ' -[0-9]\{1,\}$' > /dev/null; then
  echo matches
fi

Обратите внимание, что ^ (но не $ ) неявно содержится в expr . Мы также используем этот начальный пробел, чтобы избежать проблем со значениями $ 1 , которые оказываются операторами expr .

Также обратите внимание, что если регулярное выражение содержит \ (... \) , это повлияет на поведение expr .

В общем, лучше использовать awk , что является другим стандартным / переносимым способом сделать это (обратите внимание, что awk использует расширенные регулярные выражения):

if STRING=$1 RE='^-[0-9]+$' awk '
  BEGIN{exit(ENVIRON["STRING"] !~ ENVIRON["RE"])}'; then
...

Или используйте function:

re_match() {
  STRING=$1 RE=$2 awk '
    BEGIN{exit(ENVIRON["STRING"] !~ ENVIRON["RE"])}'
}

if re_match "$1" '^-[0-9]+$'

В этом случае вы также можете добиться этого с помощью стандартной конструкции case :

case $1 in
  ("" | *[!0-9-]* | [!-]* | - | ?*-*) ;;
  (*) echo match;;
esac

Чтобы использовать grep , вы можете использовать его с - Параметр null (где поддерживается, поскольку это не стандартный вариант), чтобы указать ему работать с записями с разделителями NUL вместо записей с разделителями новой строки. Поскольку в большинстве оболочек $ 1 не может содержать NUL, это должно быть безопасно:

 if printf %s "$1" | grep --null -xq '-[0-9]+$'; then
   echo match
 fi

13
13.04.2017, 15:36
2 ответа
  • Размер физического блока, сообщаемый fdisk , представляет собой размер физического блока, сообщаемый диском при запросе. Он редко имеет какое-либо отношение к страницам SSD или стираемым блокам.

  • Чтение / запись 4 КиБ - это общий показатель производительности ввода-вывода, представляющий «небольшие» операции ввода-вывода.

  • Не существует стандартного способа для SSD сообщать размер своей страницы или размер стираемого блока. Немногие, если какие-либо производители, сообщают о них в таблицах данных. (Потому что они могут измениться в течение срока службы SKU, например, из-за смены поставщиков.) Существует технический документ от Intel , в котором предполагается, что выравнивания 4 КиБ достаточно.

  • Для практического использования просто выровняйте все свои структуры данных (разделы, полезную нагрузку контейнеров LUKS, логические тома LVM) с границами в 1 или 2 МиБ. В конце концов, это SSD - он предназначен для работы с обычными файловыми системами, такими как NTFS (которая использует 4 единицы распределения KiB). Если Windows считает, что выравнивания разделов до 1 МБ достаточно, вы можете поспорить, что любой производитель SSD позаботится о том, чтобы их продукты хорошо работали с такой конфигурацией.

  • Лучше всего оставлять от 5% до 10% нераспределенного пространства вне любых разделов. Наличие избыточного пространства очень помогает твердотельным накопителям в сохранении их производительности во времени.

18
27.01.2020, 19:53

smartctl (доступный в smartmontools ) должен сделать это за вас.

2
27.01.2020, 19:53

Теги

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