Visitors have accessed this post 5908 times.

Базовая работа с nix. Каналы

8
2
5908
27 ноября 2020 11:54
Автор: Rebrain Me
Linux

Visitors have accessed this post 5908 times.

Автор — Юрий Изоркин

В предыдущей статье мы познакомились с ОС NixOS. Теперь рассмотрим возможности пакетного менеджера nix. Источником обновления пакетов для менеджера nix служат каналы.

Применение каналов позволяет:

  • зафиксировать ПО на определенной версии;
  • использовать устаревшее ПО, например, если какие-либо скрипты не поддерживают новую версию и требуют доработки.

Давайте посмотрим, как работать с каналами.

По умолчанию в системе прописан стабильный канал:

sudo nix-channel --list
nixos https://channels.nixos.org/nixos-20.03

Так как мы используем нестабильную ветку, канал обновления будет таким:

sudo nix-channel --list
nixos https://nixos.org/channels/nixos-unstable

Список всех каналов обновления можно посмотреть на странице https://channels.nixos.org/. Для каждого пользователя можно прописать отдельные каналы. Сейчас в нашем случае у пользователя rebrain каналы не прописаны и команда nix-channel —list выдаст пустую строку. Добавим канал с последними обновлениями пакетов и обновим его:

nix-channel --add https://channels.nixos.org/nixos-unstable-small nixpkgs
nix-channel --update

Поиск пакетов производится командой nix search <FLAGS>… <REGEX>…, флаг -u обновляет кеш программ. Например:

nix search htop

выдаст:

warning: using cached results; pass '-u' to update the cache
* nixpkgs.bpytop (bpytop-1.0.0)
  A resource monitor; python port of bashtop

* nixpkgs.htop (htop)
  An interactive process viewer for Linux

* nixpkgs.zenith (zenith-0.10.0)
  Sort of like top or htop but with zoom-able charts, network, and disk usage

где nixpkgs — имя нашего канала, bpytop — имя пакета.

Установить пакет можно несколькими способами:

  • прописать название пакета в /etc/nixos/configuration.nix, в нашем случае — в /etc/nixos/nix-config/generic/pkgs.nix в блоке environment.systemPackages, и перезапустить сборку системы;
  • выполнить команду nix-env -i bpytop, но в этом случае, из-за специфики работы, пакетный менеджер начнет анализировать содержимое канала и потреблять много оперативной памяти;
  • рекомендуется указать флаг -A, канал обновления и полное имя пакета:
    nix-env -iA nixpkgs.bpytop
    installing 'bpytop-1.0.0'
    these paths will be fetched (0.33 MiB download, 1.63 MiB unpacked):
      /nix/store/k9spzc7yhj99a0pi19ryxmr4a2kz1zf5-python3.8-psutil-5.7.0
      /nix/store/xgd78r2k3n38pqagnrrkh1mn8fwdlkr9-bpytop-1.0.0
    copying path '/nix/store/k9spzc7yhj99a0pi19ryxmr4a2kz1zf5-python3.8-psutil-5.7.0' from 'https://cache.nixos.org'...
    copying path '/nix/store/xgd78r2k3n38pqagnrrkh1mn8fwdlkr9-bpytop-1.0.0' from 'https://cache.nixos.org'...
    building '/nix/store/pffd5xbrbz7xrg07in0gz8jy4vgqlzd7-user-environment.drv'...
    created 3 symlinks in user environment
    Time: 0h:00m:03s
    bpytop --version
    bpytop version: 1.0.0
    psutil version: 5.7.0
    

Список установленных пакетов можно посмотреть командой:

nix-env -q | cat
bpytop-1.0.0

Как в системе поддерживаются точки отката, можно посмотреть командой:

nix-env --list-generations | cat
1   2020-08-09 12:08:56   (current)

Поставим еще один пакет:

nix-env -iA nixpkgs.mariadb-client
installing 'mariadb-client-10.4.13'
these paths will be fetched (1.84 MiB download, 40.25 MiB unpacked):
  /nix/store/48xcq4hxg78y1shn1wfg3z4xvcmim865-mariadb-client-10.4.13-man
  /nix/store/9i890ymiw4njc26d6ccjwlgkw2v4g6vs-mariadb-client-10.4.13
copying path '/nix/store/48xcq4hxg78y1shn1wfg3z4xvcmim865-mariadb-client-10.4.13-man' from 'https://cache.nixos.org'...
copying path '/nix/store/9i890ymiw4njc26d6ccjwlgkw2v4g6vs-mariadb-client-10.4.13' from 'https://cache.nixos.org'...
building '/nix/store/r03ghp0kr48nsab4mavnq4hczfrsih8i-user-environment.drv'...
warning: skipping dangling symlink '/nix/store/f1lgp5c7qypy6ggf3wa36p65i9451iqs-user-environment/bin/mariadb-test'
created 33 symlinks in user environment
Time: 0h:00m:03s

И посмотрим точки отката:

nix-env --list-generations | cat
1   2020-08-09 12:08:56
2   2020-08-09 12:11:30   (current)

Переключаться между точками отката можно командой:

nix-env --switch-generation 1
switching from generation 2 to 1
mysql --version
mysql: command not found
nix-env --switch-generation 2
switching from generation 1 to 2
mysql --version
mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using readline 5.1

Также пакетный менеджер nix поддерживает профили установленных пакетов и возможность переключения между ними:

nix-env --switch-profile /nix/var/nix/profiles/per-user/rebrain/profile-test

Команда nix-env -q | cat выдаст пустой результат.

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

Например, нам требуется две версии nodejs 12_x и nodejs 8_x, которая сейчас уже не поддерживается. Версию nodejs 8_x можно найти на канале nixos-19.03. Добавляем канал:

nix-channel --add https://channels.nixos.org/nixos-19.03 nixpkgs-1903
nix-channel --update

Создаем новый профиль:

nix-env --switch-profile /nix/var/nix/profiles/per-user/rebrain/profile-nodejs-8x

И устанавливаем nodejs 8_x:

nix-env -iA nixpkgs-1903.nodejs-8_x
installing 'nodejs-8.15.1'
these paths will be fetched (29.48 MiB download, 141.05 MiB unpacked):
  /nix/store/0d12kpv6fp3w2p9bjskbrhyx1vjz7384-http-parser-2.9.0
  /nix/store/0f1bal83favkgrr5mp5crw9mqrzi85b7-zlib-1.2.11
  /nix/store/4g3g1l0vii6nj6jiq70gpbikb7vclmcj-bzip2-1.0.6.0.1
  /nix/store/5my64vz61d64dppj1bdhax4mnc8x6rpa-nodejs-8.15.1
  /nix/store/5s4v1ska7pgdfj4brzkcab9kq56a0jzc-acl-2.2.53
  /nix/store/94faqmx1gwc88lrgj5dnfm9xxaf54cc0-openssl-1.0.2u
  /nix/store/9sp131l64cxncjxr2znk5v797vbl57ch-gdbm-1.18.1
  /nix/store/a13810j3gfm6nss503qwnqc2pgsawmlw-db-5.3.28
  /nix/store/czqwvknixch95pw1kcvrj5zzwk7r4py6-python-2.7.17
  /nix/store/f09zmq3sqiy0dnx8g4f1arngkjd4kih7-gcc-7.4.0-lib
  /nix/store/h0p0h3rh1q4i2yavzm3yqi716s9yaj2f-glibc-2.27
  /nix/store/issgq20n7k0z2dvgdsdgijrbd7j5fqvn-ncurses-6.1-20190112
  /nix/store/jargvpajyq21wxjaib1fj4lbnapmd7d2-libuv-1.26.0
  /nix/store/jyxphfkij1il4ip6y34832v9gakg3pqy-attr-2.4.48
  /nix/store/kzv56yx369j0jvcza2cphj2pv8xmqga4-bash-4.4-p23
  /nix/store/pqx8wsc4kx87f587b81aj4fgjshgjvi8-readline-6.3p08
  /nix/store/q2s80z6hhw1gi3wa14v5a1zppkqk9c2p-coreutils-8.30
  /nix/store/ya74davhsdfa5y0dycj75am4pps5cdq9-sqlite-3.28.0
copying path '/nix/store/h0p0h3rh1q4i2yavzm3yqi716s9yaj2f-glibc-2.27' from 'https://cache.nixos.org'...
copying path '/nix/store/jyxphfkij1il4ip6y34832v9gakg3pqy-attr-2.4.48' from 'https://cache.nixos.org'...
copying path '/nix/store/kzv56yx369j0jvcza2cphj2pv8xmqga4-bash-4.4-p23' from 'https://cache.nixos.org'...
copying path '/nix/store/4g3g1l0vii6nj6jiq70gpbikb7vclmcj-bzip2-1.0.6.0.1' from 'https://cache.nixos.org'...
copying path '/nix/store/5s4v1ska7pgdfj4brzkcab9kq56a0jzc-acl-2.2.53' from 'https://cache.nixos.org'...
copying path '/nix/store/f09zmq3sqiy0dnx8g4f1arngkjd4kih7-gcc-7.4.0-lib' from 'https://cache.nixos.org'...
copying path '/nix/store/9sp131l64cxncjxr2znk5v797vbl57ch-gdbm-1.18.1' from 'https://cache.nixos.org'...
copying path '/nix/store/q2s80z6hhw1gi3wa14v5a1zppkqk9c2p-coreutils-8.30' from 'https://cache.nixos.org'...
copying path '/nix/store/0d12kpv6fp3w2p9bjskbrhyx1vjz7384-http-parser-2.9.0' from 'https://cache.nixos.org'...
copying path '/nix/store/a13810j3gfm6nss503qwnqc2pgsawmlw-db-5.3.28' from 'https://cache.nixos.org'...
copying path '/nix/store/jargvpajyq21wxjaib1fj4lbnapmd7d2-libuv-1.26.0' from 'https://cache.nixos.org'...
copying path '/nix/store/issgq20n7k0z2dvgdsdgijrbd7j5fqvn-ncurses-6.1-20190112' from 'https://cache.nixos.org'...
copying path '/nix/store/94faqmx1gwc88lrgj5dnfm9xxaf54cc0-openssl-1.0.2u' from 'https://cache.nixos.org'...
copying path '/nix/store/0f1bal83favkgrr5mp5crw9mqrzi85b7-zlib-1.2.11' from 'https://cache.nixos.org'...
copying path '/nix/store/pqx8wsc4kx87f587b81aj4fgjshgjvi8-readline-6.3p08' from 'https://cache.nixos.org'...
copying path '/nix/store/ya74davhsdfa5y0dycj75am4pps5cdq9-sqlite-3.28.0' from 'https://cache.nixos.org'...
copying path '/nix/store/czqwvknixch95pw1kcvrj5zzwk7r4py6-python-2.7.17' from 'https://cache.nixos.org'...
copying path '/nix/store/5my64vz61d64dppj1bdhax4mnc8x6rpa-nodejs-8.15.1' from 'https://cache.nixos.org'...
building '/nix/store/gdzf45fk3x6zqvdpswndjlg2mlgirxmw-user-environment.drv'...
created 4 symlinks in user environment
Time: 0h:00m:12s

Проверяем версию:

node --version
v8.15.1

Ставим nodejs 12_x уже с последнего канала:

nix-env --switch-profile /nix/var/nix/profiles/per-user/rebrain/profile-nodejs-12x
nix-env -iA nixpkgs.nodejs-12_x
installing 'nodejs-12.18.3'
these paths will be fetched (11.78 MiB download, 61.21 MiB unpacked):
  /nix/store/97fy125s2km6j82qm1449qf4sqr3qski-libuv-1.38.1
  /nix/store/bn3n6aa85xifhnidqq31679iszr3xvmr-nodejs-12.18.3
  /nix/store/rdvambcpxagx4z91fyy69zgm71ibz6bh-icu4c-67.1-dev
copying path '/nix/store/rdvambcpxagx4z91fyy69zgm71ibz6bh-icu4c-67.1-dev' from 'https://cache.nixos.org'...
copying path '/nix/store/97fy125s2km6j82qm1449qf4sqr3qski-libuv-1.38.1' from 'https://cache.nixos.org'...
copying path '/nix/store/bn3n6aa85xifhnidqq31679iszr3xvmr-nodejs-12.18.3' from 'https://cache.nixos.org'...
building '/nix/store/4ap8npfayfjwai58v6hdyrgpaqvb4fzz-user-environment.drv'...
created 4 symlinks in user environment
Time: 0h:00m:05s
node --version
v12.18.3

В зависимости от того, какая версия nodejs требуется, переключаемся между профилями profile-nodejs-8x и profile-nodejs-12x.

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

nix-channel --update

Потом пакеты:

nix-env -u

Также пакетный менеджер nix можно установить и на другой дистрибутив Linux командой:

curl -L https://nixos.org/nix/install | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  2490  100  2490    0     0   2011      0  0:00:01  0:00:01 --:--:--  3351
downloading Nix 2.3.7 binary tarball for x86_64-linux from 'https://releases.nixos.org/nix/nix-2.3.7/nix-2.3.7-x86_64-linux.tar.xz' to '/tmp/nix-binary-tarball-unpack.wglugpsGP1'...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.4M  100 16.4M    0     0  8536k      0  0:00:01  0:00:01 --:--:-- 8536k
Note: a multi-user installation is possible. See https://nixos.org/nix/manual/#sect-multi-user-installation
performing a single-user installation of Nix...
directory /nix does not exist; creating it by running 'mkdir -m 0755 /nix && chown rebrain /nix' using sudo
copying Nix to /nix/store......................................
installing 'nix-2.3.7'
building '/nix/store/b64sdzfcc4wd2p656i9jskxdmhjkq0cv-user-environment.drv'...
created 6 symlinks in user environment
unpacking channels...
created 1 symlinks in user environment
modifying /home/rebrain/.profile...
modifying /home/rebrain/.zshrc...

Installation finished!  To ensure that the necessary environment
variables are set, either log in again, or type

  . /home/rebrain/.nix-profile/etc/profile.d/nix.sh

in your shell.
Time: 0h:00m:16s

После перезахода в шелл:

nix --version
nix (Nix) 2.3.7
nix-channel --list
nixpkgs https://nixos.org/channels/nixpkgs-unstable

Принцип работы на других дистрибутивах с nix сохраняется прежним.

От редакции

Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN

*Анонсы мероприятий каждую неделю

Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.
Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.

Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.

Комментарии (3)
Введено символов из возможных
Не отвечать
toha

Я признателен вам за статью , пытаюсь сейчас разобраться с системой , очень помогли .)

toha

Если будет возможность очень интересно нормально разобраться с Флэйками как это все работает , уже кучу материала перелопатил . ВРоде и пользоваться начал но многое остается размытым .

Вам также может понравится

Как узнать, сколько места занимают файлы и директории в Linux
array(1) { [0]=> object(WP_Term)#11549 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Для того, чтобы через интерфейс командной строки узнать, сколько места занимают файлы и директории, в Linux используется команда du. 

du расшифровывается как disk usage (использование диска).

Синтаксис команды du:

du ...

Если запустить du без указания параметров, то она выведет все директории и поддиректории текущей директории....

12
0
21 августа 2020
Как удалять файлы и директории в Linux
array(1) { [0]=> object(WP_Term)#10972 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

В некоторых случаях может потребоваться удалить ненужные директории и файлы, чтобы освободить место на жестком диске. Рассказываем, как это сделать.

Для удаления файлов используется команда rm. Предупреждение: удаление файлов и каталогов в Linux с помощью команды rm является необратимым. Поэтому следует проявлять особую осторожность при ее...

7
0
28 мая 2020
Как переименовать файл в Linux
array(1) { [0]=> object(WP_Term)#11543 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Переименование файлов Linux - одна из самых простых задач, которую вы можете выполнить непосредственно из командной строки.

Есть несколько способов, как это сделать, и в этом туториале я покажу вам, как легко можно в Linux переименовать файл.
Переименование файла в Linux с помощью команды mv
В Linux команда переименования файла - mv - одна из...

4
0
27 мая 2020