Разве CentOS 7 неправильно сортирует записи меню ядра в grub.cfg?

Технологию, которую они используют, чтобы заставить это произойти, называют NFS - Сетевая файловая система. Они могут дополнительно использовать другую технологию с названным NFS, автомонтируется, конкретно Autofs, если это - Linux.

NFS

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

Если один из клиентов получает доступ к файлу в рамках каталога, сервер NFS передает содержание этого файла клиенту NFS также.

Autofs

Автомонтирование является технологией, которая позволяет клиентской системе получать доступ к общему удаленному ресурсу, такому как NFS, на временной основе. То есть то, что клиентская система NFS имеет доступ к этой удаленной доле NFS. Но это активно "не использует" его, пока кто-то не пытается получить доступ к общему каталогу. Только затем делает клиентскую попытку NFS "смонтировать" этот удаленный каталог и его содержание.

Жизненный цикл содержания файла

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

Только, чтобы дать Вам общее представление, Вы могли использовать программу strace видеть некоторые системные вызовы, которые сделаны как прогоны программы. Так, с помощью этой команды, например:

$ strace echo "hello world" > afile

Мы видели, как файл записан в систему. Мы могли также использовать эту форму для записи в смонтированный каталог NFS:

$ strace echo "hello world" > /home/sam/afile

Обе из этих трассировок фактически идентичный.

### Локальная запись

$ cat strace_wr_local.log 
execve("/bin/echo", ["echo", "hello world"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f80000
write(1, "hello world\n", 12)           = 12
close(1)                                = 0

### запись NFS

$ cat strace_wr_remote.log 
execve("/bin/echo", ["echo", "hello world"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fbe000
write(1, "hello world\n", 12)           = 12
close(1)                                = 0

Чтение незначительно более интересно, но все еще в основном идентично.

### Локальное чтение

$ cat strace_rd_local.log 
execve("/bin/cat", ["cat", "afile"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=1761, ...}) = 0
open("afile", O_RDONLY|O_LARGEFILE)     = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
read(3, "hello world\n", 4096)          = 12
write(1, "hello world\n", 12hello world
)           = 12
read(3, "", 4096)                       = 0
close(3)                                = 0

### чтение NFS

$ cat strace_rd_remote.log 
execve("/bin/cat", ["cat", "/home/sam/afile"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=1771, ...}) = 0
open("/home/sam/afile", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
read(3, "hello world\n", 4096)          = 12
write(1, "hello world\n", 12hello world
)           = 12
read(3, "", 4096)                       = 0
close(3)                                = 0

Прохождение в пул

Если Вам просто обычно любопытно на предмет протокола NFS, можно читать больше о том, как он работает здесь в названном разделе: основы протокола NFS. Обычно легко получить фундаментальные понятия того, как это работает и существует пример запроса NFS, только чтобы дать Вам общее представление о том, как работают вещи.

Дайвинг глубже

Если Вы действительно захотите посмотреть позади занавеса, то необходимо будет, вероятно, ввести ряд инструментов для сбора сетевого трафика так, чтобы Вы видели течение битов назад и вперед между сервером NFS и одним из его клиентов. Оснащает такой, имеет tcpdump или wireshark вероятно, будут Ваши друзья в выполнении этого более глубокого погружения.

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

Этот сайт поможет Вам с этим усилием, если Вам будет действительно любопытно:

3
26.11.2014, 17:35
3 ответа

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

https://launchpad.net/ubuntu/+source/pepperflashplugin-nonfree

Его может не быть в репозитории ppa, потому что он «несвободный»?

-121--196221-

Я бы пошел на вариант dd. Потому что это гарантирует наличие «моментального снимка», подобного состоянию диска, включая главную загрузочную запись и таблицу разделов. При восстановлении можно записать образ прямо на диск, без необходимости секционирования или исправления с помощью grub.

«Где-то» должно быть любое быстрое и надежное место хранения, которое можно установить в систему спасения. Как и NFS, SCP (с использованием sshfs с предохранителем) или доля Samba. Если система спасения поддерживает его даже что-то вроде Amazon S3 должно быть возможно. Если у вас быстрая восходящая линия, «где» не имеет такого значения. Если у вас есть более медленный восходящий канал, я бы предложил сосредоточиться на месте хранения, доступном в центре обработки данных.

Возможно, вы сможете проверить возможности образа спасения. На данный момент SAN кажется хорошим вариантом. Если вы можете составить список возможных бэкэндов места хранения для системы спасения, мы поможем вам выбрать самый простой вариант.

-121--244643-

Я опубликовал исправление к двум bugzilla.redhat.com ошибкам, которое на самом деле исправляет эту проблему. патч maxschlepzig очень близок к правильному ответу, но не совсем. Мой патч основан на его.

1
27.01.2020, 21:27

Думаю, что после установки ядра можно определить, используя rpm + переключатель --scripts.

Пример

$ rpm --scripts -q kernel-$(uname -r)
postinstall scriptlet (using /bin/sh):

if [ `uname -i` == "x86_64" -o `uname -i` == "i386" ] &&
   [ -f /etc/sysconfig/kernel ]; then
  /bin/sed -r -i -e 's/^DEFAULTKERNEL=kernel-smp$/DEFAULTKERNEL=kernel/' /etc/sysconfig/kernel || exit $?
fi
preuninstall scriptlet (using /bin/sh):
/bin/kernel-install remove 3.16.6-203.fc20.x86_64 /boot/vmlinuz-3.16.6-203.fc20.x86_64 || exit $?
posttrans scriptlet (using /bin/sh):
/bin/kernel-install add 3.16.6-203.fc20.x86_64 /boot/vmlinuz-3.16.6-203.fc20.x86_64 || exit $?

Это разбито на секции: postinstall, preuninstall и postrans. Инструментом для установки/удаления ядер является этот сценарий:

/bin/kernel-install add <kernel label> </path/to/boot/vmlinuz-...> || exit $

Кто владеет этим сценарием?

Сценарий kernel-install является частью Systemd.

$ rpm -qf /bin/kernel-install 
systemd-208-28.fc20.x86_64
0
27.01.2020, 21:27

Это хорошо известная ошибка:

Для определения того, как пакет ядра обновляет grub. cfg можно отобразить скрипты через:

$ yum whatprovides /boot/vmlinuz-3.10.0-123.9.3.el7.x86_64
kernel-3.10.0-123.9.3.el7.x86_64 : The Linux kernel
[..]
$ rpm -q --scripts kernel-3.10.0-123.9.3.el7.x86_64

Это показывает, что вызывается /usr/sbin/new-kernel-pkg - что, в свою очередь, вызывает grubby.

Обходной путь

(пока не будет исправлен в RHEL/CentOS)

--- /usr/share/grub/grub-mkconfig_lib.orig  2014-06-30 18:16:11.000000000 +0200
+++ /usr/share/grub/grub-mkconfig_lib       2014-11-26 17:38:57.814000000 +0100
@@ -255,13 +255,24 @@

 version_find_latest ()
 {
-  version_find_latest_a=""
-  for i in "$@" ; do
-    if version_test_gt "$i" "$version_find_latest_a" ; then
-      version_find_latest_a="$i"
-    fi
-  done
-  echo "$version_find_latest_a"
+  # workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1124074
+  # 'grub2-mkconfig wrong sorting'
+  {
+    for i in "$@"; do
+      echo $i
+    done | grep -v rescue | sort -V
+    for i in "$@"; do
+      echo $i
+    done | grep rescue | sort -V
+  } | head -n 1
 }
1
27.01.2020, 21:27

Теги

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