Главная причина для 114 МБ (openSUSE 12.1's kernel-default-3.1.0-1.2.1.x86_64.rpm
(34 МБ)), то, что модули ядра, которые включены с об/мин, являются коллективно довольно большими.
От извлеченного об/мин, как пример:
$ du -sh lib/modules/3.1.0-1.2-default/kernel/*
1.3M lib/modules/3.1.0-1.2-default/kernel/arch
1004K lib/modules/3.1.0-1.2-default/kernel/crypto
60K lib/modules/3.1.0-1.2-default/kernel/Documentation
101M lib/modules/3.1.0-1.2-default/kernel/drivers
13M lib/modules/3.1.0-1.2-default/kernel/fs
32K lib/modules/3.1.0-1.2-default/kernel/kernel
252K lib/modules/3.1.0-1.2-default/kernel/lib
16K lib/modules/3.1.0-1.2-default/kernel/mm
12M lib/modules/3.1.0-1.2-default/kernel/net
72K lib/modules/3.1.0-1.2-default/kernel/security
9.2M lib/modules/3.1.0-1.2-default/kernel/sound
Это показывает, что существует приблизительно 101 МБ драйверов (который является чрезвычайно аппаратными модулями реализации возможностей (USB, сетевые платы, устройства хранения и т.д.).
Все ядра для современных дистрибутивов собираются иметь подобные размерные пакеты, если они не разделяют менее общие модули на подпакеты.
В среде стандартного процесса нет ничего для создания переменной только для чтения, только не окружает, имеют то понятие для их собственной среды/переменных (эти два накладываются способами, но они должны быть поняты как отличные). То же касается свойств типа как целое число, массив, функция и т.д.
Вы рассмотрели использование ограниченной оболочки, как rbash
? Вы могли установить rbash
работать readonly TEST_ENV
) в его сценарии запуска. rbash
может быть слишком строгим, хотя, но это обращается до хорошей степени к повышению проблем комментариев.
Среда является частью чтения-записи каждого процесса (см. здесь и здесь для деталей), мало того, что процесс может записать непосредственно в часть данных (через environ[]
), это может изменить указатели на него. Вы смогли делать что-то с этим (т.е. перемещать к странице только для чтения), если Вы являетесь опытными в блоке и можете найти свой путь вокруг crt
запустите код, но я не рекомендую это ;-)
Если существуют определенные команды, которые пользователи выполняют, который должен иметь определенную среду, Вы можете устанавливать только группу - выполняют и используют sudo
установить корректные переменные (например, через /etc/environment
или env_file
директива) и выполненный команда как определенная группа (сохраняющий uid). Поддержка последних версий noexec
на большинстве платформ, которые могут использоваться для предотвращения выполнения новой оболочки (хотя банка может повредить программы который законно fork()
и exec()
).
Как последняя опция Вы можете использовать LD_PRELOAD
и Ваша собственная библиотека для установки управляемой среды для некоторых/всех пользовательских процессов путем обертывания соответствующих функций libc (getenv() putenv()
и т.д.). libfaketime делает точно это в течение времени связанные функции libc. Существует менее известный инструмент, названный timetravel, который делает подобный, но также и рычаги setenv()
и getenv()
чтобы удержать контроль над LD_PRELOAD
перед лицом бедственной ситуации.
Самый устойчивый подход должен отфильтровать setenv() unsetenv() putenv()
(и возможно clearnv()
) вызовы для предотвращения модификации и фильтра getenv()
так, чтобы это всегда возвратило необходимое значение (возможно из файла). Этот подход не предотвратит непосредственное управление памятью среды через environ[]
, но, пока Вы управляете getenv()
любой процесс, который полагается на libc API, должен видеть Ваше значение. bash
использование environ[]
непосредственно, когда это инициализирует, но также и вызовы getenv()
.
Переменные только для чтения могут быть установлены в POSIX совместимые оболочки с помощью readonly
команда.
readonly VAR=foo # POSIX
declare -r VAR=foo # bash
export VAR
Это никоим образом не средство защиты, чтобы препятствовать тому, чтобы пользователь изменил его. Пользователь может всегда порождать новую оболочку и заменять переменную.
zsh
позволяет typeset +r VAR
выключить атрибут "только для чтения".
– Stéphane Chazelas
02.03.2013, 09:48
ksh
экспортируйте атрибут "только для чтения" экспортируемых переменных к среде через A__z
специальная переменная, таким образом, в недавно запущенном ksh
, переменная все еще будет только для чтения (хотя, если у Вас будет доступ к env
, или perl
или любая другая оболочка или инструмент, который может изменить переменную среды, которая не будет мешать Вам делать вещи как env VAR=new-value ksh
– Stéphane Chazelas
02.03.2013, 10:20