Всем привет. Предлагаю сделать передышку и отойти от нашего хранилища бэкапов (Первая часть и вторая часть ) и рассмотреть еще возможности испытуемой ОС. Сегодня как видно из названия мы начнем «готовку» виртуальных машин 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
Когда ночью не до сна...
На данный момент это все, дальше будем разбираться с контейнерами и полнотекстовым поиском, контейнерами и немного зайдем в программирование.