Я PXE-загружаю систему Ubuntu 10.10, где я задаю параметры ядра следующим образом:
append root=/dev/nfs initrd=ubuntu-boot/initrd.img-2.6.35-24-generic
nfsroot=11.22.33.44:/data/nfsroot,fsc ip=dhcp rw
Мне нужно использовать опцию монтирования 'fsc', чтобы использовать функциональность FS-кэша (пакет cachefilesd.) Однако, когда я пытаюсь это сделать, я получаю следующую ошибку при загрузке:
nfsmount: bad option 'fsc'
Почему nfsmount не разрешает эту опцию? (Он прекрасно работает, когда вы монтируете вручную с помощью mount -o fsc
после загрузки.)
Я изменил nfsmount на mount -t nfs
в файле /usr/share/initramfs-tools/scripts/nfs
, а затем запустил update-initramfs -u
, чтобы обновить образ initramfs, но кажется, это все еще дает ошибку:
mount: unknown nfs mount option 'fsc'
Я думаю, это ограничение функциональности монтирования в klibc . Каков наилучший способ решить эту проблему? Нужно ли исправлять программу nfsmount?
Поскольку это кажется ограничением инструмента nfsmount в klibc, я подумал, что могу добавить /sbin/mount.nfs
к образу initramfs и смонтировать nfsroot с помощью этого инструмента. вместо. Я скопировал его в папку /usr/lib/klibc/bin
и обновил скрипт /usr/share/initramfs-tools/scripts/nfs
следующим образом:
mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
После загрузки обновленного образа initramfs после запуска mount.nfs возникает долгая задержка, а затем отображается следующее сообщение:
mount.nfs: an incorrect mount option was specified
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
Однако это сообщение отображается независимо от того, какие опции монтирования я использую, поэтому, похоже, это совсем другая проблема ...
Недавно я создавал новый nfsroot на основе 16.04 и решил еще раз взглянуть на использование cachefilesd для файловой системы nfsroot. Еще раз я наткнулся на этот пост. Это помогло направить меня в правильном направлении, и в итоге я заставил его работать, но я верю, что у меня есть лучший ответ, чем тот, который был размещен здесь.
Хотя шаги Meanderix могут работать, я не думаю, что это лучший способ. Итак, вот мои шаги:
/usr/share/initramfs-tools/hooks
создайте новый файл. Я назвал мой fsc
для кеширования файловой системы. Добавьте следующее содержимое в ваш файл:
#!/bin/sh
set -e
PREREQ=""
prereqs () {
echo "${PREREQ}"
}
case "${1}" in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /sbin/mount.nfs /sbin
exit 0
Сделайте исполняемый файл fsc:
chmod 755 /usr/share/initramfs-tools/hooks/fsc
Измените /usr/share/initramfs-tools/scripts/nfs
, как подсказывает среднее значение.
Создайте свои initramfs. Например:
mkinitramfs -o /fscinitrd
Разница и настоящее волшебство здесь - это файл /usr/share/initramfs-tools/hooks/fsc
. В частности, линия copy_exec
. Когда начальный RAM-диск будет создан, он автоматически добавит mount.nfs
к initramfs. Но подождите, это еще не все! Он также определит необходимые библиотеки и добавит их для вас. Это действительно круто, так как в Ubuntu 16.04 мне нужно было libtirpc.so
, поскольку mount.nfs
зависело от него, и это добавило мне эти зависимости.
После этого и настройки cachefilesd у меня теперь есть кэширование файловой системы для моего NFSROOT, и это просто потрясающе.
Ядро не было скомпилировано с этим модулем (CONFIG_NFS_FSCACHE в конфигурации ядра). И ссылка на руководство для этого: Ubuntu Kernel / Compile
Мне наконец удалось это решить. Вот шаги:
/usr/lib/klibc/bin folder
.) Измените строку nfsmount в /usr/share/initramfs-tools/scripts/nfs
:
mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
Обновите образ initramfs с помощью mkinitramfs
или update-initramfs
.
Это включит опцию fsc в nfsroot для моей системы Ubuntu 10.10. Я понятия не имею, почему я не могу использовать mount.nfs из 10.10 - возможно, регрессия?