Vagrant — автоматизация виртуальных машин

Vagrant — система администрирования виртуальных машин из коммандной строки.
Vagrant сама по себе не является виртуальной машиной, это средство автоматизации управления чужими виртуальными машинами например Virtual Box.
Можно использоваться готовыми контейнерами виртуальных машин, указав образ, который необходимо загрузить в конфигурационном файле Vagrant или самостоятельно собрать собственный контейнер.

Просмотр версии:
vagrant — -version 

https://app.vagrantup.com/boxes/search — список доступных образов

Создание машины:
vagrant init generic/centos7
Включение машины:
vagrant up
Запрос состояния машин: 
vagrant status 
Полное выключение машины :
vagrant halt
Удаление машины :
vagrant destroy
Зайти в машину по ssh :
vagrant ssh

Допишим в файл ключей запись о машине которая хоччет подключаться к виртуальной :
vim ~/.ssh/authorized_keys


В хост системе в отдельном терминале выведем свой публичный ключ и его содержимое добавим в конец файла на виртуальной машине:
vim ~/.ssh/id_rsa.pub

После этого можно попасть на виртуальную машину :
ssh -p 2222 vagrant@127.0.0.1

По умолчанию в виртуальной машине создается пользователь vagrant с паролем vagrant
Выполнение команд от root возможно с применением sudo , работает даже на CentOS

На хост машине имеется файл конфигурации Vagrantfile, в нем можно задать свои параметры, пробросить порт увеличить память и тд, без учета комментариев это выглядит так:

Vagrant.configure("2") do |config|
  config.vm.box = "generic/centos7"
  config.vm.provider "virtualbox" do |vb|
        vb.memory = "2048"
   end
   config.vm.network "forwarded_port", guest: 80, host: 8080
   config.vm.synced_folder "src/", "/srv/website" , disable: true

   config.vm.provision "shell", inline: <<-SHELL
     sudo yum -y update
     sudo yum install -y httpd
     sudo systemctl enable httpd
     sudo systemctl start httpd
     sudo firewall-cmd --zone=public --add-service=http --permanent
     sudo systemctl restart firewalld.service
   SHELL
end

1 Скачается и создастся виртуальная машина на базе CentOS с оперативной памятью 2 Гб, 
2 Из виртуальной машины будет проброшен порт 80 -> 8080 хост системы
3 Будет создана общая папка для синхронизации файлов ( /src — на хосте , /srv/website  на виртуалке.
4 Система обновиться
5 Установится web сервер , он будет добавлен в «автозагрузку» 
6 На постоянной основе под него будет открыт порт на фаерволе.

Документация по применяемым параметрам :

https://www.vagrantup.com/docs/vagrantfile/machine_settings.html

Конвертация Raw образов дисков в формат VirtualBox

Бывает необходимость перенести проект из облака в локальную сеть.
Многие сервисы предлагающие VPS имеют функцию скачать образ вашего жесткого диска в формате raw.
Поле того как вы получите слепок диска на свой локальный компьютер его можно сконвертировать в формат понятный VB (*.vmdk)

VBoxManage convertfromraw /Users/Downloads/rawdiskfile vdhard.vmdk --format VMDK

Далее использовать его новых или имеющихся виртуальных машин.

Вызов код C из Swift

К уже имеющемуся проекту на Swift можно добавить функционал на языке «С».
Для этого в Xcode создайте новый файл «*.c»

После создания файла Xcode сам предложит создать файл «моста»
Таким же образом можно создать мосты и с C ++, Objective-C.


Давайте создадим прототип функции  для кода C в файле (factorial.h):

#ifndef factorial_h
#define factorial_h

#include

long factorial(int n);

#endif /* factorial_h */

Реализуем метода в (factorial.c):

#include "factorial.h"

long factorial(int n) {
    if (n == 0 || n == 1) return 1;
    return n * factorial(n-1);
}

Далее в файле «моста» (write_to_file-Bridging-Header.h) импортируйте файл заголовка C :

#include "factorial.h"

Все! Можно использовать функцию в коде на Swift :

print("Hello \(factorial(5))!")

Оригинальная статья

Установка Swift 4.1 на Ubuntu 16.04

Установка Swift 4.1.1 на Ubuntu 16.04
Установка компилятора и библиотек:

sudo apt-get install clang libicu-dev libcurl3 libicu-dev libpython2.7

Скачивание Swift под вашу версию Ubuntu:

wget https://swift.org/builds/swift-4.1.1-release/ubuntu1604/swift-4.1.1-RELEASE/swift-4.1.1-RELEASE-ubuntu16.04.tar.gz

Распаковка:

 tar -xzf swift-4.1.1-RELEASE-ubuntu16.04.tar.gz

Далее необходимо добавить /usr, лежащую в папке swift-4.1.1-RELEASE-ubuntu16.04 добавить в переменную окружения PAHT:

 export PATH=/home/u5/swift-4.1.1-RELEASE-ubuntu16.04/usr/bin:"${PATH}"

Проверяем:

swift --version

Если после перезагрузки системы Swift слетит то нужно прописать переменную окружения в файл .profile :

vim ./.profile

В конце файла добавить :

PATH=/home/u5/swift-4.1.1-RELEASE-ubuntu16.04/usr/bin:"${PATH}"

Режим интерпретатора :

swift

Выход Ctrl + Z

Для компиляции полноценной программы понадобиться разобраться с понятием пакета, создадим пустую папку:

mkdir Hello
cd Hello

Для создания исполняемого файла нужно создать полную структуру пакета:

swift package init --type executable

Собираем пакет:

swift build

Запускаем пакет:

.build/debug/Hello

В итоге листинг программы лежит в папке:

Hello/Sources/main.swift

Установка KDE на Debian 9

Установка обновленной программы установки и инструменты работы с зависимостями.

apt install aptitude tasksel

Установка рабочего стола с использованием регулярных выражений.

aptitude install ~t^desktop$ ~t^kde-desktop$

Debian 9 в VirtualBox + Guest Additions

Установка Guest Additions в VirtualBox нужно для лучшей потдержки графики, работы буфера обмена и доступа к жесткому диску хост машины.
1. Загружаем Debian в VirtualBox, открываем Терминал и переходим в режим супер-пользователя. SU

 SU 

2. Обновляем систему

apt-get update
apt-get upgrade

3. Установка необходимых модулей ядра, заголовочные файлы.

apt install build-essential module-assistant dkms

4. Сборка модулей ядра

m-a prepare

5. В меню VirtualBox (Device -> insert Guest Additions CD image)

sh /media/cdrom/VBoxLinuxAdditions.run

Процесс должен завершиться без ошибок!
6. Перезагружаем систему

shutdown -r now

Монтирование диска Raspberry Pi (постоянное)

Возникла задача использовать Raspberry Pi как NAS хранилище.
Идея проста, Pi по MAC адресу получает у роутера постоянный IP, на роутере подключен сервис NO_IP или ( в Zyxel и Mikrotik есть свой собственный Dynamic DNS). В итоге получается некое доменное имя и настройками роутера переправляется на R-Pi.

1. Включаем SSH и меняем пароль пользователя Pi

sudo raspi-config

2. Подключаем USB внешний жесткий диск к Raspberry Pi (желательно с внешним питанием), проверяем подключенные диски командой:

fdisk -l

3. Создаем в домашнем каталоге папку

mkdir /home/pi/edit

4. Монтируем диск к этой папке

sudo mount /dev/sda1  /home/pi/edit

5. Далее смотрим содержимое файла /etc/mtab ВНИМАНИЕ НА ПОСЛЕДНЮЮ СТРОЧКУ!
6. Открываем на редактирование с правами sudo файл /etc/fstab и добавляем последней сточкой строку из /etc/mtab. ОЧЕНЬ внимательно не пропуская знаков и пробелов. Сохраняем /etc/fstab. Перезагружаем R-Pi
7. Если вы ошиблись при написании строчки то R-Pi скорее всего не загрузиться. Возможно прийдется переустанавливать Raspbian.

PS Вместо FTP лучше используйте SSH (SFTP), но понадобиться модель не ниже Pi-2.

Bash

Скрипт это обычный текстовый файл, поэтому просто создаем его в любом текстовом редакторе:

vim script.sh

Сделаем скрипт исполняемым :

chmod +x script.sh

Запускать скрипт будем командой :

./script.sh

Первая строчка в скрипте должна начинаться с :

#!/bin/bash

Объявление переменной :

a=175

Объявление ссылки на переменную :

var2=$a

Вывод на экран :

echo $var2
    Объявление строковой переменной :

    b="Hello World"

    Объявление строковой переменной :

    c=$(df --total)

Условие (обратите внимание на пробелы между знаками! ) :

#!/bin/bash
a=9
b=8
if [ "$a" = "$b" ]; then
echo "A = B"; else
echo "A! = B" 
fi

Цикл while / do
Бесполезный но понятный пример. Если a не равно b то пингуем ya.ru :

#!/bin/bash
a=3
b=6
while [ $a -ne $b ] ; do
ping ya.ru -c3
sleep 10
done

В зависимости от типа данных в условии можно использовать :
= — равно.
!= — неравно.
-eq — эквивалентно.
-ne — не эквивалентно.
-qt — больше чем.
-lt — меньше чем.

Цикл for
ping сначала пошлет 5 запросов , на втором круге 10 :

#!/bin/bash
for a in 5 10
do
ping ya.ru -c "$a"
done

Еще вариант (начальное значение, шаг , конечное значение)

for a in $(seq 10 5 90)
for (( a=10; a<=90; a+=5 ))

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

#!/bin/bash
a=$1

Будет использоваться первый аргумент

Terminal

!! повтор последней команды.
sudo!! повтор последней команды с правами супер-пользователя.
history выводит список когда либо вводимых команд.
!23 Повторить 23 команду из списка history.
!$ использует аргументы от предыдущей выполненной команды.
Можно ускорить навигацию по различным папкам с помощью добавления их в стек папок
Находясь в нужной директории наберите :

pushd

папка добавиться в стек.

pushd /путь/к/папке/

добавит еще одну папку в стек.
Просмотр стека :

dirs -v

Переход между папками

cd ~цифра обозначенная напротив папки

Перенаправленние вывода программы в файл (при повторном вызове файл полностью перезапишится)

ps -ax > processes.txt

Перенаправленние вывода программы в файл (при повторном вызове в файл допишится информация)

ps -ax >> processes.txt

Создание папки сразу с подпапками :

mkdir -p ~/Documents/{work,admin,texts}

Сравнение двух папок :

diff /folder1 /folder2

Поиск команды по описанию :

apropos “download”

Генерация ключей GPG

Генерация новой пары ключей :

gpg --gen-key

1 — Вопрос тип ключа (RSA по умолчанию)
2 — Длинна ключа (2040 по умолчанию)
3 — Срок действия ключа (по умолчанию без срока)
4 — Введите имя (любое)
5 — Введите почту (неважно какую и не важно будите ли вы отправлять письма с этой почты с этим ключом)
6 — комментарий можно оставить пустым
7 — «O» — принять изменения
8 — Ввести парольную фразу
9 — Ввести повтор парольной фразы

Просмотреть список ключей в системе :

gpg --list-keys

Экспортировать ключ в файл :

gpg --output publik.key --armor --export ПОЧТА УКАЗАННАЯ ПРИ ГЕНЕРАЦИИ

Импортировать чужой ключ в систему :

gpg --import publik.key

Зашифровать файл для пользователя XxXxX файл main.c полученный файл main.c.gpg можно передавать по почте :

gpg -r XxXxX -e main.c