Вносить изменения в sysctl при запуске

1

Я хотел бы изменить настройки smb по умолчанию при запуске, чтобы удалить тайм-ауты. У меня есть следующий скрипт;

#!/bin/sh

sysctl net.smb.fs.kern_deadtimer=0
sysctl net.smb.fs.kern_hard_deadtimer=0
sysctl net.smb.fs.kern_soft_deadtimer=0

Запуск этого скрипта с sudoкорректно устанавливает соответствующие параметры ядра. Так что я знаю, что эти команды правильные.

Я создал следующий LaunchDaemon, /Library/LaunchDaemons/чтобы попытаться запустить этот скрипт при запуске;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.jo.sysctl</string>
    <key>Disabled</key>
    <false/>
    <key>UserName</key>
    <string>admin</string>
    <key>GroupName</key>
    <string>staff</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/admin/scripts/sysctl.sh</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Я проверил plist с, plutilи это проверяет хорошо. Я установил разрешения для сценария оболочки 0755и установил право собственности на файл plist root:wheel.

Бег

sudo launchctl load /Library/LaunchDaemons/com.jo.sysctl.plist

...ничего не делает. Значения по умолчанию все еще установлены неправильно. Куда я иду не так?

Спасибо

Джек Уэстмор
источник
Вы, вероятно, хотите использовать весь путь к sysctl.
Аллан
/private/etc/sysctl.conf все еще должен работать в High Sierra! ( man sysctl.conf)
Кланомат
@ Аллан /Users/admin/scripts/sysctl.shвесь путь?
Джек Уэстмор
2
Чтобы увидеть, что происходит, добавьте следующее к каждой sysctlкоманде. 2>&1 >> /Users/admin/myscript.log Таким образом, ваша команда должна выглядеть следующим /usr/bin/sysctl net.smb.fs.kern_deadtimer=0 2>&1 >> /Users/admin/myscript.log образом: вы можете увидеть, какие сообщения и сообщения об ошибках генерируются, если таковые имеются.
Аллан
1
* .deadtimer - это все "sysctl: неизвестный oid * .deadtimer" в моей среде High Sierra. То есть они не существуют!
Кланомат

Ответы:

4

Вероятно, лучше отказаться от сценария и использовать файл настроек, разработанный для этой цели: sysctl.conf

Это относится к macOS 10.12 Sierra.
как отметил @klanomath в комментариях: "* .deadtimer - это все" sysctl: unknown oid * .deadtimer "в моей среде High Sierra. То есть они не существуют!"
Похоже, что эта часть интерфейса sysctl полностью исчезла.

sudo nano  /private/etc/sysctl.conf

добавьте следующие переменные:

net.smb.fs.kern_deadtimer=0
net.smb.fs.kern_hard_deadtimer=0
net.smb.fs.kern_soft_deadtimer=0

Если после этого вы загрузитесь в подробном режиме ( cmd+ vпри запуске или sudo nvram boot-args="-v"перед перезагрузкой), вы должны увидеть применение пользовательских настроек.

После этого вы должны увидеть такие сообщения при загрузке:

net.smb.fs.kern_deadtimer: 60 -> 0
net.smb.fs.kern_hard_deadtimer: 600 -> 0
net.smb.fs.kern_soft_deadtimer: 30 -> 0

В противном случае проверьте с

sysctl -a | grep smb

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

LangLangC
источник
В комментариях ОП сказал, что они попробовали этот метод, и он не работал.
Аллан
Все дерево net.smb. * Исчезло. Поэтому я бы лучше написал «состояния ядра исчезли», чем «эта часть интерфейса sysctl полностью исчезла» ;-)
klanomath
Я тестирую на машинах под управлением macOS Sierra и High Sierra. Запуск sysctl -a | grep smbвозвращает тот же результат. Так что я не уверен, что правильно утверждать, что «интерфейс sysctl полностью исчез». В моем тестировании я заметил, что все ссылки на smb * исчезли ПОСЛЕ того, как я начал вносить изменения в /etc/sysctl.conf и перезагрузился. Однако те же настройки появятся снова, как только я открою соединение smb ...
Джек Уэстмор,
На самом деле, я считаю , что причина создания / редактирования /etc/private/sysctl.confвовсе не работают, потому что служба СМБ не запускается , пока не инициировать соединение с кем - л (я полагаю ...).
Джек Уэстмор
0

Я нашел другой способ сделать это в конце концов.

Хитрость заключалась в том, чтобы установить более длительное значение времени ожидания по умолчанию /etc/nsmb.confследующим образом:

[default]
max_resp_timeout=1000     # default is 30 which way too low!

Спасибо всем за вашу помощь :-)

Джек Уэстмор
источник