среда, 29 июля 2015 г.

Замена HDD или компьютера целиком (перенос на другой диск) Xubuntu 14.04

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


Берем новый комп и подключаем к нему диск со старого компа (который нужно переписать). 


Грузимся с флешки или CD-образа.

Разбираемся с дисками (fdisk -l /dev/sda и fdisk -l /dev/sdb нам в помощь). Будем 
полагать что sda - новый, а sdb старый диск, так обычно и бывает. 

Заводим иерархию (в предположении что у нас на старом диске есть / и /home) 
/mnt/old/root и /mnt/old/home.

Монтируем старый диск (это избавит его от случайного повреждения, большинство системных программ предупредит о попытке что-то сделать с примонтированным диском). 
mount /dev/sdb1 /mnt/old/root и mount /dev/sdb3 /mnt/old/home.

Разбиваем новый диск. Обычно первый раздел примерно 20-30Г под /, второй swap (2 объема памяти), третий - остатки под /home. 

Создаем файловые системы и своп, даем им сразу приличиствующие имена.
mkfs.ext4 -L rootfs /dev/sda1 
mkfs.ext4 -L homefs /dev/sda3 
mkswap -L swapfs /dev/sda2

Монтируем новый /  
mount /dev/sda1 /mnt/new

Копируем рутовый раздел. 
cd /mnt/old/root 
tar c . | ( cd /mnt/new ; tar xvf - )

Удаляем в новом разделе /media/* - это нужно, поскольку тут обычно используются расширенные атрибуты (acl) которые мы при копировании перетаскивать не стали, при работе fusefs все что нужно создастся само, если мы не удалим старые каталоги, то fusefs работать не будет (не открываются флешки). 
rm -rf /mnt/new/media/*

На всякий случай ревизируем, что там скопировалось в lost+found, если что-то  там есть, скорее всего, это нужно стереть и хорошо подумать откуда оно взялось...

Монтируем новый /home. 
mount /dev/sda3 /mnt/new/home

И копируем содержимое. 
cd /mnt/old/home 
tar c . | ( cd /mnt/new/home ; tar xvf - )

Подключаем /dev, /sys и /proc  к новой файловой системе. 
mount -B /dev /mnt/new/dev 
mount -B /proc /mnt/new/proc

mount -B /sys /mnt/new/sys

Чрутимся в новую ФС. 
chroot /mnt/new

Правим /etc/fstab.  Вместо UUID=бла-бла-бла пишем LABEL=rootfs и LABEL=homefs и LABEL=swapfs  соответственно. Если грызут сомнения в части дубляжных имен, хорошая идея на будущее rootfs20150730.  

И ставим загрузчик 
grub-install /dev/sda 
update-grub

poweroff и снимаем старый диск. Все!


Крайне полезно после загрузки с нового диска запустить apt-get update и apt-get upgrade, grub пожалуется на отсутствующий старый диск и позволит выбрать новый (/dev/sda).

Дополнение от 20 сентября 2016

  Копирование большого количества файлов, особенно возобновление оного после какой-либо неудачи удобно делать не tar-ом, а rsync-ом
rsync -aHAX /mnt/old/home/ /mnt/new/home/
  Атрибуты сохраняются, в том числе расширенные. Запомнить опять же легко (на великом и могучем), если хочется наглядности - добавить буковку "v". И вот еще что - если копируем огромные объемы (от 2Тб при условии мелких файлов, а не фильмов) нужно иметь или достаточное количество оперативной памяти (8Г - хороший выбор), или подключать swap, иначе имеем шанс после 10 часов ожидания получить выпадение в ошибку, это и tar и rsync примерно одинаково.


воскресенье, 26 июля 2015 г.

Про HDMI, DVI, старенькую NVIDIA, и звук в Kubuntu

  Дело было так. Была у меня старенькая карта, которая служила верой правдой, замечаний по службе не имела. В качестве монитора (кабелем DVI-HDMI) к ней был подключен большой - большой телевизор LG (второй канал не использовался) и все это работало под Kubuntu 12.x (не помню она апрельская или февральская). Карточка была вот такая:
  Просто замечательная. не грелась и не шумела. Звук она передавать в принципе, похоже, не умела и он был проброшен отдельным простым аналоговым кабелем.
  Карточка сдохла. Стала она быстро нагреваться и всякие чудеса рисовать. Нашел я у себя такую же примерно старую EN9400GT, она с одним выходом во всех видах HDMI, DVI, VGA. Поставил, со звуком ничего не делал, но он магическим образом исчез! Все настройки телевизора перепроверил, выяснил (путем подтыкания наушников) что в кабеле он есть, а упрямый телеящик его не слышит - видать что-то такое передает "новая" карточка по HDMI - интерфейсу, что дает основания считать телевизору что звук идет то же по HDMI! По ходу пьесы вот еще какое замечание. Пробовал я использовать VGA интерфейс, вход в телевизоре есть. И звук есть. Но! Моим не самым острым зрением видна существенная потеря качества. Для HD аналог уже не годится...
  Углубление в теорию дало вот что. Карты бывают, как минимум, трех поколений. Первые, самые старые. Ничего про звук не знают и в HDMI/DVI гонят соответствующий признак. Телевизор понимает что надо включать или аналог, или внешний SPDIF, который обычно на оптоволокне. К этому поколению была отнесена моя старая, сдохшая карточка. Моя "новая" карточка относится к следующему, среднему поколению. Они имеют едва приметный разъем для подключения SPDIF прям внутри компа с материнки, и транслируют его в HDMI или DVI в безусловном порядке. Ну и третья группа, о них везде и прописано, что при установке NVIDIA-шного драйвера появляется еще и звуковое устройство, которое надо прописать в настройках как выходное для звука.
   Ну вот, все встало на места, надо победить проводок. При помощи китайского мультиметра выясняем, что единственный разъем на видеокарте имеет верхнюю ножку намертво проброшенную на "массу", стало быть нижняя - SPDIF-вход. Ну а на материнке все прописано в описании, на фото использован кабель от CD-ROM.

  Реально нужен один проводок, у нас он черный. Подойдет какой угодно. +5 не используется и висит не одетым на стороне видеокарты, масса лишней не будет. Никаких настроек не потребовалось. Материнка - P5KC - старая... Вот такая практическая работа. 

пятница, 3 июля 2015 г.

Сохранение (backup) клиентских виртуальных машин.

Исходные данные: 
Xubuntu 14.04 (64 разряда + Windows всех мастей под VirtualBox).

Есть много (штук примерно 20) компьютеров под Xubuntu, на которых установлен VirtualBox и запускается виртуальная машина. Конечно винды, конечно с комплектом каких-то мерзких, совершенно не переносимых программ для формирования налоговой отчетности и т.п. Этот зоопарк (виртуалки) надо периодически сохранять. Бэкапить саму Ксубунту смысла никакого, ее быстрее, случись чего, заново поставить. Все полезные документы исключительно на серверах (или внутри ВМ...).  Всякие хорошие и полезные программы типа bacula ориентированы на копирование серверов и несколько избыточны в плане возможностей (ну и не слишком в плане удобства и дружелюбия). Требование примерно такие. 

  1. Все хранится в дереве файлов. Никаких доп. баз данных.
  2. Формат хранения не требует никаких средств кроме общесистемных для извлечения архивной копии.
  3. Запускается на клиенте, пишет на сервер.
  4. Желательно кроме основной копии на сервере (одной) иметь еще несколько архивных копий на самом клиенте.
  5. Ну и простота, для прозрачности процесса.

Как и что. 

В качестве хранилища rcyncd, делаем модуль в режиме write-only, это защитит копию от всякого рода рисков. Все клиенты в единое дерево, идентификация по имени машины и клиента, чтоб заранее в дереве ничего не создавать. В качестве средства создания локальной копии tar и logrotate. Запуск в "околоручном" режиме при попытке выхода из сеанса. Вот с этого места и начнем.


В xfce4 выход из сеанса реализован запуском xfce4-session-logout. Живет она где-то в /usr/bin. Если взять свой скриптик, поименовать его так же и положить в /usr/local/bin, получим его вызов стандартными средствами при попытке выхода из сеанса или выключения компьютера. 

Ну вот он и есть /usr/local/bin/xfce4-session-logout:

#! /bin/bash

###
# Пре-назначения. В конфиг файле можно все переназначить
FLAG=$HOME/.need2backupvm
VMDIR=$HOME/.Virtulbox\ VMs
VMNAME='Mint\ 17'
BASE='root@192.168.20.1::onecopy'
NROTATE=5
LOCALSTORE=$HOME/.local/share/vb_backup

CONFIG=$HOME/.config/vmbackupconfig
SYSTEMPROG=/usr/bin/xfce4-session-logout
COPY=/usr/local/bin/copy_vm.bash

# Config
test -r ${CONFIG} && . ${CONFIG}

# Check flag
if [ ! -r $FLAG ] ; then
  $SYSTEMPROG
  exit 0
fi
###

# Make selection
res=`zenity --list --radiolist \
       --title="Резервная копия виртуальной машины" \
       --text="Настало время скопировать ВМ, выберете вариант. Копирование занимает примерно час" \
       --column="Выбор" --column="parametr" --column="Что дальше" \
       TRUE "bcppower" "Запуститить копирование, по окончании выключить" \
       FALSE "bcponly" "Запустить копирование, по окончании не выключать" \
       FALSE "sys" "Отложить копирование (вызвать системый диалог)" \
       --hide-column=2 --print-column="2"`
CASE=$?

case $CASE in
0)
  case ${res} in
  sys)
  $SYSTEMPROG
  ;;
  *)
notify-send -i info Information "Резервное копирование запущено"
# Make backup here
#
# $1 - имя ВМ для остановки
# $2 - каталог, который мы копируем
# $3 - база к которой будет добавлено $DEST на сервере
# в виде root@192.168.20.1::onecopy
# $4 - Локальное хранилище                                                      
# $5 - количество копий 

$COPY "$VMNAME" "$VMDIR" $BASE "$LOCALSTORE" "$NROTATE" | logger
notify-send -i info Information "Резервное копирование завершено"
rm -f $FLAG
if [[ $res == 'bcppower' ]] ; then
 $SYSTEMPROG --halt 
fi
  ;;
  esac
  ;;
-1)
          zenity --error --text="Внутреняя ошибка 001."
  ;&
    1)
  $SYSTEMPROG
  ;;

esac

exit 0

Задача скрипта совсем не сложная - проверить флажок (пора - не пора, ставим его по крону с нужной периодичностью), получить добро у юзера и запустить вторую часть.

Часть вторая, /usr/local/bin/copy_vm.bash:

#! /bin/bash
#
# $1 - имя ВМ для остановки
# $2 - каталог, который мы копируем
# $3 - база к которой будет добавлено $DEST на сервере
# в виде root@192.168.20.1::onecopy
# $4 - Локальное хранилище
# $5 - количество копий

DEST=`hostname -s`
DEST=$DEST-$USER
LIST=`VBoxManage list runningvms |grep "$1" | cut -d'"' -f2`
LRSTATE=$HOME/.cache/logrotate/vm_copy
LRCONF=$HOME/.config/vm_copy-logrotate
TARFILE=${4}/vm.tar

# Выключаем нужную ВМ
if [[ -n $LIST ]] ; then
        VBoxManage controlvm "$LIST" savestate 2>&1  | logger
fi

# Копия на сервер
rsync -a -H -x -o --numeric-ids --del -A "$2" ${3}/$DEST/

# Локальная копия (архив)
# Делаем конфиг для logrotate
echo "$TARFILE {
  rotate $5
  compress
}" > ${LRCONF}

# Каталог нодобно заранее создать...
mkdir -p ${4}

# logrotate
touch "$LRSTATE"
test -r ${TARFILE} && logrotate -f -s "$LRSTATE" "$LRCONF"

# Тарим
tar cf ${TARFILE} "$2"

Тут и пояснять-то нечего.

На сервере (там стоит не слишком свежая Гента, но отличий почти нет). Фрагмент конфига. /etc/rsyncd.conf

# This line is required by the /etc/init.d/rsyncd script
pid file = /run/rsyncd.pid

# Global
use chroot = yes
address = 192.168.20.1

[onecopy]
path = /mnt/storage/onecopy
comment = Client backups
read only = false
write only = true
uid = root
list = false
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso

Что в итоге?

Во всей получившейся, довольно стройной, системе нет ни единого пароля. Все сделано без подпиливания каких-либо штатных средств. Практически вся нагрузка остается на клиенте, сервер не напрягаем. Путем небольших изменений конфига можно заставить самую последнюю копию хранить на клиенте, а остальные дублировать на сервер (а оно нужно?)
Да, в конфиге ничего интересного:
spec-5@spec-5:~/.config$ less vmbackupconfig 
VMDIR=$HOME/.VirtualBox/Machines
VMNAME='WinXP'
BASE='root@192.168.20.1::onecopy'

В /etc/cron.weekly/vmbcp (имя файла не имеет значения)
#! /bin/bash

# VM backup
DUSER=имя подставить
touch /home/${DUSER}/.need2backupvm
chmod a+rw /home/${DUSER}/.need2backupvm

Последнее изменение 20150826