Всем привет. Предлагаю сделать передышку и отойти от нашего хранилища бэкапов (Первая часть и вторая часть ) и рассмотреть еще возможности испытуемой ОС. Сегодня как видно из названия мы начнем «готовку» виртуальных машин c помощью nix‑build.
А динамические данные как например данные в БД — мы будем заливать ручками(это полезно).
Что у нас в меню:
Qemu
Postgresql
Mysql
открытые датасеты
Для начала немного теории:
1. PostgreSQL — это мощная объектно‑реляционная система баз данных с открытым исходным кодом, активная разработка которой ведется более 35 лет и заслужила прочную репутацию благодаря надежности, функциональной устойчивости и производительности. (https://www.postgresql.org/)
2.0. MySQL — свободная реляционная система управления базами данных (СУБД). Под словом «свободная» подразумевается ее бесплатность, под «реляционная» — работа с базами данных, основанных на двумерных таблицах. Система выпущена в 1995 году, её разработка активно продолжается. ( https://dev.mysql.com/ )
2.1 MariaDB Server — одна из самых популярных реляционных баз данных с открытым исходным кодом. Он создан первоначальными разработчиками MySQL и гарантированно останется открытым исходным кодом. Он является частью большинства облачных предложений и используется по умолчанию в большинстве дистрибутивов Linux.
Он основан на ценностях производительности, стабильности и открытости, и Фонд MariaDB гарантирует, что вклад будет принят на технических основаниях. Недавние новые функции включают в себя расширенную кластеризацию с помощью Galera Cluster 4, функции совместимости с базой данных Oracle и таблицами временных данных, позволяющие запрашивать данные в том виде, в каком они были в любой момент в прошлом.
3. Датасет представляет собой набор данных, которые используются в различных видах анализа и машинного обучения. Причем успешность последнего напрямую зависит от объема исходной информации: чем ее больше, тем качественней будет развиваться ИИ.
В данном примере мы будем скачивать их с ресурсов,которые предосталяют доступ к наборам данных без регистрации и авторизации для народного wget.
1) https://www.northlincs.gov.uk
Перейдем к практике.
Проверим, что все в репозиториях есть и каких версий (необьязательно,но интересно, возможно пригодится):
Ищем нужные пакеты с помощью nix-shell --packages и несколько раз нажимаем на tab, чтобы лишний раз их не ставить, а просто узнать, есть ли он.
PostgreSQL
# nix-shell --packages postgre postgresql postgresql_11_jit postgresql_12 postgresql12Packages postgresql13JitPackages postgresql_14_jit postgresql_15 postgresql15Packages postgresql_jdbc postgresqlPackages postgresql_10 postgresql11JitPackages postgresql_12_jit postgresql_13 postgresql13Packages postgresql14JitPackages postgresql_15_jit postgresql_9_6 postgresql_jit postgresqlTestHook postgresql_11 postgresql11Packages postgresql12JitPackages postgresql_13_jit postgresql_14 postgresql14Packages postgresql15JitPackages postgresql96 postgresqlJitPackages postgrey
MariaDB
# nix-shell -p mariadb mariadb mariadb_1011 mariadb_105 mariadb_108 mariadb-client mariadb-connector-c_3_1 mariadb-embedded mariadb_1010 mariadb_104 mariadb_106 mariadb_109 mariadb-connector-c mariadb-connector-c_3_2 mariadb-galera
Для проверки можно воспользоваться командой (также для тестирования,или когда пакет нужен только единожды):
nix-shell --packages
Example:
# nix-shell --packages manticoresearch можно запустить команду мантикоры: #searchd --version Manticore 5.0.3 1e84bbd46@221013 dev Copyright (c) 2001-2016, Andrew Aksyonoff Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com) Copyright (c) 2017-2022, Manticore Software LTD (https://manticoresearch.com) можно также в данном режиме написать тестовый конфиг и его отладить,посмотреть на работу мантикоры. и выходим из шелла командой: # exit
Пропишем в нашем системном конфигурационном файле нужные нам строки.
Для запуска Qemu хочет X11 и графическую оболочку:
Честно скоммунизженное с личного хоста: # Enable the X11 windowing system. services.xserver.enable = true; services.xserver.displayManager.sddm.enable = true; services.xserver.desktopManager.xfce.enable = true; Настраиваем ресурсы которые гипервизор может отдать под ВМ virtualisation.vmVariant = { # following configuration is added only when building VM with build-vm virtualisation = { memorySize = 2048; # Use 2048MiB memory. cores = 2; }; };
Перезапускаемся и должен нас приветствовать дисплейный менеджер.
Сделаем виртуальную копию дистрибутива на котором сидим(оно нам пригодится):
nixos-rebuild build-vm
Делаем 3 разных конфига для виртуальных машин и заполняем виртуалки данными.
Конфиг виртуальной машины 1 с (postgresql)
let pkgs = import <nixpkgs> { }; # This module defines the system that we want PostgresModule = { ... }: { services.postgresql = { enable= true ; enableTCPIP = true; authentication = pkgs.lib.mkOverride 10 '' #type database DBuser auth-method local all all trust host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 trust ''; initialScript = pkgs.writeText "backend-initScript" '' CREATE ROLE murzik WITH LOGIN PASSWORD 'murzik' CREATEDB; CREATE DATABASE OpenData; GRANT ALL PRIVILEGES ON DATABASE OpenData TO Murzik; ''; }; }; debugVm = { modulesPath, ... }: { imports = [ # The qemu-vm NixOS module gives us the `vm` attribute that we will later # use, and other VM-related settings "${modulesPath}/virtualisation/qemu-vm.nix" ]; virtualisation.forwardPorts = [ { from = "host"; host.port = 2220; guest.port = 22; } { from = "host"; host.port = 5432; guest.port = 5432; } ]; # Root user without password and enabled SSH for playing around networking.firewall.enable = false; services.openssh.enable = true; services.openssh.permitRootLogin = "yes"; users.extraUsers.root.password = ""; }; nixosEvaluation = pkgs.nixos [ debugVm PostgresModule ]; in nixosEvaluation.config.system.build.vm
соберем командой:
nix-build postgresvm.nix
запустим командой через в самой виртуалке вручную через GUI Terminal : ./result/bin/run-nixos-vm

проверим что Postgresql работает:
# ssh -p 2220 root@localhost "systemctl status postgresql.service" (root@localhost) Password: ● postgresql.service - PostgreSQL Server Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: enabled) Active: active (running) since Tue 2023-09-12 12:09:27 UTC; 22min ago Process: 682 ExecStartPre=/nix/store/hnlancn6bifxr75bf5j9zj9firgbpkp7-unit-script-postgresql-pre-start/bin/postgresql-pre-start (code=exited, status=0/SUCCESS) Process: 762 ExecStartPost=/nix/store/lachsy0bx9yy51md02mw3gl81gzk8yh8-unit-script-postgresql-post-start/bin/postgresql-post-start (code=exited, status=0/SUCCESS) Main PID: 704 (postgres) IP: 52.1K in, 52.1K out IO: 996.0K read, 700.0K written Tasks: 7 (limit: 1150) Memory: 18.9M CPU: 5.878s CGroup: /system.slice/postgresql.service ├─704 /nix/store/dsgziywn8ghg6g9xn7wr9q5cszjbpqng-postgresql-14.9/bin/postgres ├─754 "postgres: checkpointer " ├─755 "postgres: background writer " ├─756 "postgres: walwriter " ├─758 "postgres: autovacuum launcher " ├─759 "postgres: stats collector " └─760 "postgres: logical replication launcher " Sep 12 12:09:19 nixos postgres[704]: [704] LOG: listening on IPv4 address "0.0.0.0", port 5432 Sep 12 12:09:19 nixos postgres[704]: [704] LOG: listening on IPv6 address "::", port 5432 Sep 12 12:09:19 nixos postgres[704]: [704] LOG: listening on Unix socket "/run/postgresql/.s.PGSQL.5432" Sep 12 12:09:20 nixos postgres[731]: [731] LOG: database system was interrupted; last known up at 2023-09-12 12:04:19 GMT Sep 12 12:09:23 nixos postgres[731]: [731] LOG: database system was not properly shut down; automatic recovery in progress Sep 12 12:09:23 nixos postgres[731]: [731] LOG: redo starts at 0/1700098 Sep 12 12:09:23 nixos postgres[731]: [731] LOG: invalid record length at 0/17000D0: wanted 24, got 0 Sep 12 12:09:23 nixos postgres[731]: [731] LOG: redo done at 0/1700098 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s Sep 12 12:09:24 nixos postgres[704]: [704] LOG: database system is ready to accept connections Sep 12 12:09:27 nixos systemd[1]: Started PostgreSQL Server.
Теперь в консоли заходим в папку где у постгри есть доступ и загрузим туда csv файл:
ssh -p 2220 root@localhost "cd /var/lib/postgresql/ && wget https://www.northlincs.gov.uk/wp-content/uploads/2018/10/on_street_parking_points.csv && chown postgres:postgres ./on_street_parking_points.csv"
Идем дальше уже и будем импортировать данные в нашу бд и проверим, что все ок.
[root@nixserver1:/home/vasya/vm/mysql]# ssh -p 2220 root@localhost (root@localhost) Password: Last login: Tue Sep 12 17:22:34 2023 from 10.0.2.2 [root@nixos:~]# su postgres [postgres@nixos:/root]$ psql psql (14.9) Type "help" for help. postgres=# \c opendata You are now connected to database "opendata" as user "postgres". opendata=# \dt Did not find any relations. opendata=# CREATE TABLE parking_points ( id SERIAL ,type VARCHAR(100),restrictn VARCHAR(1000),spaces VARCHAR(100),street VARCHAR(100),town VARCHAR(100),easting VARCHAR(100),northing VARCHAR(100),longitude VARCHAR(100),latitude VARCHAR(100),PRIMARY KEY(id)); CREATE TABLE opendata=# COPY parking_points (id,type,restrictn,spaces,street,town,easting,northing,longitude,latitude) FROM '/var/lib/postgresql/on_street_parking_points.csv' DELIMITER ',' CSV HEADER; COPY 195 opendata=# select * from parking_points; id | type | restrictn | spaces | street | town | easting | northing | longitude | latitude -----+--------------------+------------------------------------------------------------------------+--------+-------------------------------+--------------------+---------+----------+-----------+----------- 1 | Parking | Parking 2 Hours No Return 2 Hours Mon-Sat 8am-6pm | 7 | HIGH STREET | EPWORTH | 478143 | 403888 | -0.821104 | 53.525592 2 | Disabled Parking | Disabled Badge Holders Only 3 Hours No Return 2 Hours Mon-Sat 8am-6pm | 1 | HIGH STREET | EPWORTH | 478174 | 403879 | -0.820632 | 53.525505 3 | Parking | Parking 2 Hours No Return 2 Hours Mon-Sat 8am-6pm | 7 | HIGH STREET | EPWORTH | 478289 | 403824 | -0.818916 | 53.524996 4 | Disabled Parking | Disabled Badge Holders Only 3 Hours No Return 2 Hours Mon-Sat 8am-6pm | 1 | MARKET PLACE | EPWORTH | 478338 | 403802 | -0.818187 | 53.524794 ... 192 | Disabled Parking | Disabled Parking 3 hour no return 2 hour Mon-Sat 9am - 6pm | 3 | CARLTON STREET | SCUNTHORPE | 489907 | 411466 | -0.643132 | 53.592072 193 | Parking | Parking 1 Hour No Return 2 Hour Mon-Sat 9am-5pm Except Permit Holders | 30 | LINDLEY STREET | SCUNTHORPE | 489486 | 408753 | -0.650268 | 53.567765 (195 rows)
Конфиг виртуальной машины 2 с MariaDB
let pkgs = import <nixpkgs> { }; MysqlModule = { ... }: { services.mysql = { enable= true ; package = pkgs.mariadb; initialDatabases =[ { name = "enterprice"; } ]; initialScript = pkgs.writeText "mariadb-init.sql" '' CREATE USER 'databarsik'@'localhost' IDENTIFIED BY 'databarsik'; GRANT ALL PRIVILEGES ON *.* TO 'databarsik'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; USE enterprice; CREATE TABLE enterprice( Bank_Name TEXT(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, City TEXT(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, State TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, Cert TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, Acquiring_Institution TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, Closing_Date VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, Fund VARCHAR(500) NOT NULL, PRIMARY KEY(Fund)); ''; }; }; debugVm = { modulesPath, ... }: { imports = [ "${modulesPath}/virtualisation/qemu-vm.nix" ]; virtualisation.forwardPorts = [ { from = "host"; host.port = 2225; guest.port = 22; } { from = "host"; host.port = 3306; guest.port = 3306; } ]; }; networking.firewall.enable = false; services.openssh.enable = true; services.openssh.settings.PermitRootLogin = "yes"; users.extraUsers.root.password = "vasya"; nixosEvaluation = pkgs.nixos [ debugVm MysqlModule ]; in nixosEvaluation.config.system.build.vm
соберем командой:
nix-build MysqlVM.nix
запустим командой: ./result/bin/run-nixos-vm
Настройка Mysql
Зайдем в папку где есть доступ у Mysql и загрузим туда csv файл:
ssh -p 2221 root@localhost "cd /var/lib/mysql/ && wget https://www.fdic.gov/bank/individual/failed/banklist.csv"
Убираем название столбцов:
ssh -p 2221 root@localhost "sed '1d' /var/lib/mysql/banklist.csv"
Потом заходим на саму виртуальную машину:
ssh -p 2221 root@localhost
В сам Mysql, смотрим какие базы нам доступны загружаем наш csv и проверяем данные:
#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 10.6.15-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | enterprice | | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 6 rows in set (0.032 sec) MariaDB [(none)]> use enterprice; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed ######Качаем датасет: MariaDB [enterprice]> LOAD DATA INFILE '/var/lib/mysql/banklist.csv' INTO TABLE enterprice CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; Query OK, 567 rows affected (0.221 sec) Records: 567 Deleted: 0 Skipped: 0 Warnings: 0 MariaDB [enterprice]> show tables; +----------------------+ | Tables_in_enterprice | +----------------------+ | enterprice | +----------------------+ 1 row in set (0.005 sec) MariaDB [enterprice]> describe enterprice; +-----------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------+-------+ | Bank_Name | text | NO | | NULL | | | City | text | NO | | NULL | | | State | text | NO | | NULL | | | Cert | text | NO | | NULL | | | Acquiring_Institution | text | NO | | NULL | | | Closing_Date | varchar(500) | NO | | NULL | | | Fund | varchar(500) | NO | PRI | NULL | | +-----------------------+--------------+------+-----+---------+-------+ 7 rows in set (0.016 sec) MariaDB [enterprice]> select * from enterprice; +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+ | Bank_Name | City | State | Cert | Acquiring_Institution | Closing_Date | Fund | +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+ |Metropolitan Savings Bank | Pittsburgh | PA | 35353 | Allegheny Valley Bank of Pittsburgh | 2-Feb-07 | 10000 |NetBank | Alpharetta | GA | 32575 | ING DIRECT | 28-Sep-07 | 10001 |Miami Valley Bank | Lakeview | OH | 16848 | The Citizens Banking Company | 4-Oct-07 | 10002 |Douglass National Bank | Kansas City | MO | 24660 | Liberty Bank and Trust Company | 25-Jan-08 | 10003 |Hume Bank | Hume | MO | 1971 | Security Bank | 7-Mar-08 | 10004 |ANB Financial, NA | Bentonville | AR | 33901 | Pulaski Bank and Trust Company | 9-May-08 | 10005 |First Integrity Bank, NA | Staples | MN | 12736 | First International Bank and Trust | 30-May-08 | 10006 |IndyMac Bank | Pasadena | CA | 29730 | OneWest Bank, FSB | 11-Jul-08 | 10007 ... +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+ 567 rows in set (0.022 sec) MariaDB [enterprice]> exit; Bye
Когда ночью не до сна...

На данный момент это все, дальше будем разбираться с контейнерами и полнотекстовым поиском, контейнерами и немного зайдем в программирование.