Стефан Шэкелер. Советы и хитрости NetBSD, 2021

Вступительное слово

Это мои заметки по NetBSD. Изначально они были написаны для NetBSD 7, но затем были немного расширены и теперь тажке применым к NetBSD 8 и 9.

Обратите внимание на приглашения:

Управление энергосбережением

Текущая и доступные частоты центрального процессора:

$ sysctl -a | grep freq
machdep.est.frequency.current = 1333
machdep.est.frequency.available = 2167 1667 1333 1000

Установка частоты центрального процессора:

# sysctl -w machdep.est.frequency.current=1333

Демон масштабирования частоты из pkgsrc sysutils/estd:

/etc/rc.conf:

estd=YES
estd_flags="-d -b -M 1667" # ограничение сверху 1667 МГц

СДЕЛАТЬ: Изучить поддержку C-состояния и P-состояния в NetBSD.

Засыпание в память на amd64:

# sysctl -w hw.acpi.sleep.state=3

Засыпание в память на i386:

# zzz

Засыпание на диск:

Засыпание на диск в {Net|Open|Free}BSD не поддерживается.

Отключение управления энергосбережением для исправления Load_Cycle_Count:

# atactl wd0 apm set 254

Примечание: atactl wd0 apm disable не работает.

Установка уровня apm:

# atactl wd0 apm set <значение>

Чтение уровня apm (похоже, что это нельзя сделать при помощи atactl):

# smartctl -g apm /dev/rwd0d
APM level is: 254 (maximum performance)

На моей системе управление энергосбережением отключено с помощью команды atactl wd0 apm set 254, которая прописана в /etc/rc.local. Эти настройки сбрасываются после засыпания в память, поэтому эту команду нужно выполнять повторно, например следующим образом:

# zzz; date; sleep 30; date; . /etc/rc.local; smartctl -g apm /dev/rwd0d

Примечание о sleep: после выполнения zzz компьютер всё ещё продолжает рабоать несколько секунд. Без sleep выполнение /etc/rc.local произойдёт перед засыпанием, а не после него. Пауза в 30 секунд подходит для любого компьютера.

Обновление микрокода Intel:

Пакет sysutils/intel-microcode-netbsd динамически загружает самый свежий микрокод с сайта Intel.

Ручная загрузка

# /usr/pkg/share/examples/rc.d/intel-microcode onestart

Автозагрузка в процессе загрузки

# cp /usr/pkg/share/examples/rc.d/intel-microcode /etc/rc.d
# echo microcode=YES >> /etc/rc.conf

Исходный микрокод на моём компьютере имеет версию 0xC2:

$ cpuctl identify 0 | grep microcode
cpu0: microcode version 0xc2, platform ID 1
$ cpuctl identify 1 | grep microcode
cpu1: microcode version 0xc2, platform ID 1

Обновлённый микрокод имеет версию 0xE2:

$ cpuctl identify 0 | grep microcode
cpu0: microcode version 0xe2, platform ID 1
$ cpuctl identify 1 | grep microcode
cpu1: microcode version 0xe2, platform ID 1

Отобразить показания датчиков (температуры, батареи):

$ envstat
                         Current  CritMax  WarnMax  WarnMin  CritMin  Unit
:
cpu0/cpu1 temperature:    69.000   99.000                             degC
:

Таблица температур центральных процессоров cpu0/cpu1 (знойным летним вечером) (после выполнения sysctl -w machdep.est.frequency.target=1000):

Частота Простой make-j2
1000 МГц 47 ℃ 57 ℃
1333 МГц 51 ℃ 68 ℃
1667 МГц 56 ℃ 80 ℃
2167 MHz 65 ℃ 94 ℃

smartctl:

При помощи smartctl из sysutils/smartmontools можно следить за исправностью дисков:

# smartctl -a /dev/rwd0d
:

Например:

# smartctl -a /dev/rwd0d | grep Load_Cycle_Count

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
193 Load_Cycle_Count        0x0032   086   086   000    Old_age   Always   144467

Состояние батареи:

Отобразить текущее состояние батареи (с помощью пакета graphics/gnuplot):

$ while true; do envstat | grep charge: | cut -b 25-35 >> charge; gnuplot -e "set term xterm; plot [0:][0:] 'charge' using 0:1"; sleep 10; done

Ядро

Интерфейс ядра

В BSD нет файловой системы /sysfs. Получить доступ к интерфейсу ядра из пользовательского пространства можно при помощи команды sysctl. Например, sysctl -a, sysctl -w xxx.yyy.zzz=3.

Время компиляции

Время компиляции ядра NetBSD 7.0-RC2 GENERIC на процессоре Core Duo с помощью системного компилятора gcc-4.8.4 при работающей системе X11:

Параллельность 1000 МГц 1333 МГц 1667 МГц 2167 МГц
make -j1 depend 4м13.150с 3м11.536с 3м14.164с 2м11.462с
make -j1 25м25.067с 19м15.233с 16м16.665с 12м36.376с
make -j2 depend 2м40.423с 2м10.196с 1м48.069с 1м29.399с
make -j2 14м27.399с 11м20.775с 9м20.556с 8м00.394с

XXX При make -j1 depend есть несоответствие между временем для 1333 и 1667 МГц XXX

Сборка ядра:

См. раздел "Пользовательское пространство". Файл конфигурации - /usr/src/sys/arch/*/conf/GENERIC.

Пользовательское пространство

Этапы сборки пользовательского пространства:

  1. Первоначальное получение исходных текстов из репозитори (-7 - это самая свежая стабильная версия, например 7.0, 7.1 и т.д.):

    # cd /usr
    # export CVS_RSH=ssh 
    # cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r netbsd-7 -P src
    # cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r netbsd-7 -P xsrc
    1. Последующее обновление исходных текстов инструментов, ядра и пользовательского пространства:

      # cd /usr/src
      # export CVS_RSH=ssh 
      # cvs update -dP
    2. Последующее обновление исходных текстов системы X-Window:

      # cd /usr/xsrc
      # export CVS_RSH=ssh 
      # cvs update -dP
  2. Сборка инструментов, ядра, пользовательского пространства и X-Window [время при 1,667 ГГц][-u: не очищать][-x: также собрать и установить X-Window (это не делается из каталога /usr/xsrc)][MKDEBUG: собрать отладочные символы и установить в каталог /usr/XXX]:

    # mkdir /usr/obj /usr/tools
    # cd /usr/src
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools tools # 24 минуты 08 секунд
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools kernel=GENERIC # 21 минута 57 секунд
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools modules # 29 минут 54 секунды
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin MKDEBUG=1 MKDEBUGLIB=1 ./build.sh -x -u -O ../obj -T ../tools distribution # 5 часов 15 минут 59 секунд
  3. Установка инструментов, ядра, пользовательского пространства и X-Window:

    # cd /usr/src
    # mv /netbsd /netbsd.old
    # mv /usr/obj/sys/arch/amd64/compile/GENERIC/netbsd /
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -O ../obj -T ../tools installmodules=/
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -x -O ../obj -T ../tools install=/ 
    # rm -rf /usr/tools /usr/obj
    # shutdown -r now
  4. Сборка и установка всего в одну строку:

    PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools tools && PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools kernel=GENERIC && PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -u -O ../obj -T ../tools modules && PATH=/sbin:/usr/sbin:/bin:/usr/bin MKDEBUG=1 MKDEBUGLIB=1 ./build.sh -x -u -O ../obj -T ../tools distribution && mv /netbsd /netbsd.old && mv /usr/obj/sys/arch/amd64/compile/GENERIC/netbsd / && PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -O ../obj -T ../tools installmodules=/ && PATH=/sbin:/usr/sbin:/bin:/usr/bin ./build.sh -x -O ../obj -T ../tools install=/

Этапы отладки пользовательского пространства NetBSD:

Мои этапы для исправления ошибки lib/50367:

  1. cscope /usr/src (также проиндексирует подключаемые файлы из каталога /usr/include):

    # cd /usr/src
    # cscope-indexer -r -v
  2. Сборка оптимизированных двоичных файлов и библиотек, а также файлов с отладочными символами:

    # cd /usr/src [-u не очищать - пропустите эту опцию при первом запуске]
    # PATH=/sbin:/usr/sbin:/bin:/usr/bin MKDEBUG=1 MKDEBUGLIB=1 ./build.sh -u -O ../obj -T ../tools distribution

    XXX Похоже, что отладочные версии не были установлены - возможно нужно настроить переменную окружения MKDEBUG, а также переменные для установки

    # ls /usr/obj/usr.bin/getaddrinfo/
    getaddrinfo.c getaddrinfo.o getaddrinfo getaddrinfo.debug
  3. Отладка нового двоичного файла:

    # LD_LIBRARY_PATH=/usr/obj/lib/libc gdb getaddrinfo
    (gdb) set solib-search-path /usr/obj/lib/libc
    Reading symbols from /usr/obj/lib/libc/libc.so.12.193.1...
    Reading symbols from /usr/obj/lib/libc/libc.so.12.193.1.debug...
  4. Запуск программы со вновь собранной разделяемой библиотекой:

    # LD_LIBRARY_PATH=/usr/obj/lib/libc getaddrinfo heise.de
  5. Сохранение изменений:

    # cd /usr/src
    # cvs diff > changes.diff # Отличия от версии на CVS-сервере
    # patch -R < changes.diff # Отменяем изменения

Pkgsrc

Файлы конфигурации:

/etc/mk.conf, /root/.profile (частично) и /root/.cvsrc. Запускайте все команды в /usr/pkgsrc.

Проверка целостности пакета:

# pkg_admin check

Обновление файлов pkgsrc:

# cvs update

Обновление установленных пакетов:

  1. Узнать, какие пакеты нужно обновить (установленные пакеты сравниваются с pkgsrc):

    # pkg_chk -u -q
  2. Обновление этих пакетов (а также пересборка зависимых пакетов):

    # pkg_chk -u -s

Переключение на другую ветку:

# cvs update -dP -rpkgsrc-2013Q2

Переключение на текущую ветку:

# cvs update -dPA

Периодическая очистка:

# rm -rf /var/tmp/pkgsrc/ # Это путь WRKOBJDIR в моём файле /etc/mk.conf
# rm /usr/pkgsrc/distfiles/*
# rm /usr/pkgsrc/packages/All/*

WiFi

СДЕЛАТЬ. Пока что попробуйте ifconfig wpi0 list scan и wap_gui.

Виртуализация

Начиная с NetBSD 9.0 и с pkgsrc версии 2020Q1, в NetBSD появилось ускорение qemu при помощи nvmm [подробности]. Компиляция ядра Linux в гостевой виртуальной машине с Debian 10 по сравнению с обычным qemu ускоряется примерно в 20 раз.

  1. Установите продвинутый emulators/qemu/ из pkgsrc-2020Q1
  2. Предоставление доступа к nvmm указанному пользователю, в данном случае sschaeck

    # echo "nvmm:*:34:sschaeck" >> /etc/group
    # chown root:nvmm /usr/pkg/bin/qemu-system-x86_64
    # chmod g+s /usr/pkg/bin/qemu-system-x86_64
  3. Настройка во время загрузки (или добавьте имя модуля в /etc/modules.conf):

    # modload nvmm
  4. Создание псевдонима для команды (не обязательно):

    $ alias qemu="qemu-system-x86_64 -accel nvmm"
  5. qemu 101 (подразумевается использование указанного выше псевдонима)

    1. Загрузка виртуальной машины с образа ISO

      $ qemu -m 512M -cdrom /opt/isos/KNOPPIX*.iso
    2. Создание пустого диска объёмом 10 гигабайт

      $ qemu-img create -f qcow2 /opt/qemu/debian.img 10G
    3. Установка операционной системы с загрузочного образа ISO на только что созданный пустой диск (загруженный ISO будет видеть пустой диск):

      $ qemu -hda /opt/qemu/debian.img -cdrom /opt/isos/firmware-10.3.0-amd64-netinst.iso -boot d -m 512M -netdev user,id=mynet0,host=10.0.2.10 -device e1000,netdev=mynet0
    4. Загрузка операционной сисетмы с диска (IP-адрес в виртуальной машине 10.0.2.15 / SSH с компьютера в виртуальную машину ssh sschaeck@127.0.0.1 -p 7001):

      $ qemu -hda /opt/qemu/debian.img -m 512M -netdev user,id=mynet0,host=10.0.2.10,hostfwd=tcp:127.0.0.1:7001-:22 -device e1000,netdev=mynet0
    5. Монтирование виртуальной машины на компьютере (хак, хак, хак):

      # mount_psshfs -O Port=7001 sschaeck@127.0.0.1:/ /mnt/tmp 
        ...
      # umount /mnt/tmp

Разное

Аудиомикшер:

Управляйте громкостью при помощи mixerctl, например, mixerctl -a; mixerctl -w monitor.output=200.

SSHFS:

X:

Запуск приложений X от имени пользователя root или от другого пользователя (который тут называется otheruser).

$ echo $DISPLAY
$ xhost local:otheruser
$ su - otheruser
$ export DISPLAY=:0 # DISPLAY увеличивается при каждом запуске. Отсчёт начинается с команды №1

Шрифты Восточно-Азиатских языков:

Поставляются в пакетах fonts/cyberbit-ttf и fonts/kochi-ttf (нужны оба).

Запись компакт-дисков и DVD:

СДЕЛАТЬ

Эмуляция Linux:

NetBSD поддерживает бесшовную эмуляцию Linux. Пакет meta-pkgs/suse* позволяет развернуть в каталоге /usr/pkg/emul/linux[32|64]/ полное пользовательское пространство Linux.

Двоичные файлы для Linux с зависимостями от библиотек из /usr/pkg/emul/linux[32|64]/, скачанные из интернета, можно запускать из такого каталога как /opt/bin/. Однако перед этим нужно сменить корневой каталог на /usr/pkg/emul/linux[32|64]/:

# chroot /usr/pkg/emul/linux32/ /bin/bash
bash-3.00# uname -a
Linux hostname 3.11.6 #1 SMP PREEMPT Thu Oct 24 16:23:02 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

СДЕЛАТЬ: Попробовать собрать ядро Linux внутри окружения с изменённым корневым каталогом.

Шифрование диска:

В отличие от OpenBSD и FreeBSD, NetBSD не поддерживает полное шифрование диска. Фреймворк шифрования NetBSD, который называется CGD, шифрует все разделы внутри определённого слайса одной парольной фразой. Я зашифровал слайс, содержащий ровно один раздел - раздел /home. Также можно зашифровать раздел подкачки в другом слайсе парольной фразой, которая каждый раз генерируется случайным образом. Это у меня получилось лишь частично.

Обновление: Я узнал о cgdroot для шифрования корневой файловой системы. Но я его не использовал.

Ограничения

Связь с автором

Шлите ваши комментарии. Контактные данные указаны на главной странице.

Автор перевода на русский язык: Владимир Ступин