Приблизительное резервное копирование таблицы разделов с sfdisk

Метод № 1

Найдите конфигурационный файл NetworkManager и добавьте/измените следующую запись (в CentOS5, в котором это находится /etc/NetworkManager/nm-system-settings.conf или /etc/NetworkManager/system-connections/) и отредактируйте свой файл соединения DSL:

[ipv4]
method=auto
dns=8.8.8.8;4.2.2.2;
ignore-auto-dns=true

Примечание: - если [ipv4] не работает затем попытка с [ppp]

Метод № 2

Можно изменить разрешение /etc/resolv.conf так, чтобы это не могло быть записано другими сервисами, или можно использовать chattr.

Метод № 3

Создайте сценарий, как упомянуто ниже в /etc/Networkmanager/dispatcher.d/ и не забывайте делать это исполняемым файлом:

#!/bin/bash
#
# Override /etc/resolv.conf and tell
# NetworkManagerDispatcher to go pluck itself.
#
# scripts in the /etc/NetworkManager/dispatcher.d/ directory
# are called alphabetically and are passed two parameters:
# $1 is the interface name, and $2 is "up" or "down" as the
# case may be.

# Here, no matter what interface or state, override the
# created resolver config with my config.

cp -f /etc/resolv.conf.myDNSoverride /etc/resolv.conf

запись /etc/resolv.conf.myDNSoverride

nameserver 8.8.8.8
4
20.03.2017, 12:04
1 ответ

Приступая к работе

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

#! /bin/bash
for (( CON1=10000; CON1<=99999; CON1++ )) ;
do
  echo $CON1
done

Теперь, когда я запускаю его, я буду использовать head -5 , чтобы просто показать первые строки 5, которые он выводит.

$ ./cmd.bash | head -5
10000
10001
10002
10003
10004

Хорошо, так что выглядит хорошо, проверьте конец так:

$ ./cmd.bash | tail -5
99995
99996
99997
99998
99999

Это выглядит хорошо тоже. Теперь давайте выясним, пути мы могли бы подойти к следующему этапу идентификации чисел с 2 цифрами из набора {4,5,6}. Мой первый инстинкт здесь, чтобы пойти на grep . Есть также методы для этого чисто в Баше, но я люблю использовать различные инструменты, grep , awk и sed для выполнения таких вещей, главным образом потому, что так работает мой разум.

Подход

Так как мы можем grep строки, которые содержат 2 цифры из аппарата, {4,5,6}? Для этого можно использовать нотацию набора, которая написана так в regex, [456]. Можно также указать, сколько цифр должно совпадать с этим набором. Это написано так:

[456]{#}

Где # - число или диапазон чисел. Если бы мы хотели 3, мы бы написали [456] {3} . Если бы мы хотели 2-5 цифры, мы бы записали [456] {2,5} . Если требуется 3 или более, [456] {3,} '.

Таким образом, для вашего сценария это [456] {2} . Для использования регекса в grep необходимо, чтобы определенная версия grep поддерживала коммутатор -E . Обычно это доступно в большинстве стандартных grep .

$ echo "45123" | grep -E "[456]{2}"
45123

Кажется, что это работает, но если мы дадим ему числа с 3, мы начинаем видеть проблему:

$ echo "45423" | grep -E "[456]{2}"
45423

Это тоже совпадение. Это происходит потому, что grep не имеет понятия, что это цифры в последовательность. Это глупо. Мы сказали, чтобы он сказал нам, если серия символов в нашем ряде из набора и что есть 2 из них и есть 2 цифры в последовательность 45423 .

Это также не удается для этих последовательностей:

$ echo "41412" | grep -E "[456]{2}"
$

Так этот метод пригоден? Это если мы немного изменим тактику, но нам придется возродить регекс.

Пример

$ echo -e "41123\n44123\n44423\n41423" | grep -E "[^456]*([456][^456]*){2}"
44123
44423
41423

Выше представлены 4 типа последовательностей. echo-e «41123\n44123\n4423\n41423» просто печатает 4 числа из нашего диапазона.

$ echo -e "41123\n44123\n44423\n41423"
41123
44123
44423
41423

Как работает этот регекс? Он устанавливает образец regex, равное нулю или большему числу символов «not [456]», а затем 1 или большему числу символов [456] или нулю или большему количеству символов «not [456]», и ищет 2 вхождения последнего.

Теперь мы делаем небольшую сборку в вашем сценарии.

for (( CON1=10000; CON1<=99999; CON1++ )) ;
do
  if echo $CON1 | grep -q -E "[^456]*([456][^456]*){2}"; then
      echo $CON1
    fi
done

Используя нашу головную и хвостовую хитрость сверху, мы видим, что она работает:

$ ./cmd.bash | head -5
10044
10045
10046
10054
10055

$ ./cmd.bash | tail -5
99955
99956
99964
99965
99966

Но этот метод оказывается собачьим медленным. Проблема в том, что grep . Это дорого, и мы выполняем "grep 1 времени, за итерацию через цикл, так что это ~ 80 тысяч раз!

Чтобы улучшить то, что мы можем переместить нашу команду grep за пределы цикла и запустить ее 1 время,после того, как список был создан, как это, используя нашу первоначальную версию сценария, который только что повторил числа:

$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}"

ПРИМЕЧАНИЕ: Мы могли бы удалить цикл for полностью и использовать инструмент командной строки, seq . При этом генерируется одна и та же последовательность чисел, seq 10000 99999 .

Один лайнер?

Модным способом для этого было бы использовать последовательность чисел из вышеуказанной команды, а затем направить ее в команду paste , которая вставляет + между каждым числом, а затем запустить этот вывод в калькулятор командной строки, bc .

$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}" | paste -s -d"+"
10044+10045+10046+10054+10055+10056+10064+10065+10066+10144+10145+...

$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}" | paste -s -d"+" | bc
2409327540

Но это совершенно другой способ решения этой проблемы, так что давайте вернемся к для цикла.

Использование чистого Bash

Поэтому нам нужен какой-то метод тестирования, если цифра имеет точно 2 цифры в Bash, но не так дорого, как вызов grep 80k раз. Современные версии Bash включают в себя возможность совпадения с помощью оператора = ~ , который может делать совпадение аналогично grep . Давайте посмотрим на это дальше.

#!/bin/bash
for (( CON1=10000; CON1<=99999; CON1++ )) ;
  if [[ $CON1 =~ [^456]*([456][^456]*){2} ]]; then
    echo $CON1
  fi
done

Выполнение этого действия делает именно то, что мы хотим.

$ ./cmd1.bash  | head -5
10044
10045
10046
10054
10055

$ ./cmd1.bash  | tail -5
99955
99956
99964
99965
99966

Проверка показывает, что он работает с 41511 сейчас:

$ ./cmd1.bash | grep 41511
41511

Ссылки

-121--133847-

Ok, следующие несколько загрузок выявили проблему. Возрастали проблемы с чтением памяти, и в конечном итоге видео даже не включалось для самотестирования питания BIOS. Я открыл корпус - графическая карта и слот AGP имеют метку палки, закрывающую 2-3 разъема. Карта повреждена, вероятно, ditto для главной платы.

-121--244776-

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

Использование sfdisk, fdisk и т.д. для создания резервной копии таблицы разделов является хорошей идеей (если случайно не ввести неправильную команду:). Но для дополнительной страховки мне нравится создавать резервные копии загрузочных секторов моих дисков с помощью dd.

Вы уверены , что sda1 начинается в блоке 1, или это было предположение? Раньше было обычным, что только 1 блок использовался в начале диска, так как это все, что вам нужно, чтобы держать MBR и (первичный) таблицы разделов, но в последние годы это было обычным для разбиения программного обеспечения, чтобы зарезервировать больше места, например, начальный сектор 63 для 1-го раздела не является необычным. Я также видел, как программное обеспечение разбиения (gparted, IIRC) резервировало мегабайт в начале диска, а затем вытесняло все последующие разделы на границы мегабайта.

В старых системах важно, чтобы перегородки запускались и останавливались на границах цилиндров. IOW, неразделенная область в начале диска должна быть целым числом цилиндров, и так же должен каждый последующий первичный раздел; на конце диска, как правило, также имеется нераспределенное пространство. Но это, как правило, не было проблемой в течение многих лет, но много разбиения программного обеспечения все еще упоминает об этом,На всякий случай, если вы заинтересованы.:)

Однако перегородки должны начинаться и останавливаться на границах сектора. И это значительно упрощает анализ ваших блочно-ориентированных данных в первом списке. Таким образом, блоки 2441214 + могут только относиться к блокам 2441214.5 = 4882429 секторов = 2499803648 байт.

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

3
27.01.2020, 20:58

Теги

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