We use as distribution a gentoo system. The KVM will be installed on a raid1 (mirror) with LVM2. We use the standard procedure to install the gentoo system.
I start the installation from an already running system (you can even boot from a boot CD, USB stick or any other linux live system).
The system where I will install is located on /dev/sda. We will start with one harddisk, the second harddisk will be plugged into the system after it is running fine the raid system will mirror the data automatically.
The harddisk must be completely empty.
Prepare the harddisk
Raid Device |
/dev/sda |
missing |
Type |
/dev/sda1 |
Bios boot partition |
Bios boot partition |
1MiB |
/dev/md0 |
Raid for Gentoo-KVM |
Raid for Gentoo-KVM |
Raid-1 (mirror) |
parted /dev/sda
mklabel gpt
(say yes if parted asks you)
mkpart boot1 1MiB 2MiB
mkpart kvm1 2MiB 100%
set 1 bios_grub on
set 2 raid on
quit
mdadm --create /dev/md0 --level=mirror --raid-devices=2 /dev/sda1 missing
mdadm --grow /dev/md0 -b internal
pvcreate /dev/md0
vgcreate vg-kvm /dev/md0
lvcreate -L100M -nboot vg-kvm
lvcreate -L4GB -nswap vg-kvm
lvcreate -L30GB -nroot vg-kvm
mkfs.ext2 -L boot /dev/vg-kvm/boot
mkfs.ext4 -L root /dev/vg-kvm/root
mkswap /dev/vg-kvm/swap
swapon /dev/vg-kvm/swap
mount /dev/vg-kvm/root /mnt/gentoo/
mkdir /mnt/gentoo/boot
mount /dev/vg-kvm/boot /mnt/gentoo/boot/
Installation of Gentoo
Make sure you have the following use flags defined in /etc/portage/make.conf
USE="bindist mmx sse sse2 -ldap perl python lvm parted qemu virt-network avahi sasl audit nfs"
MAKEOPTS="-j5"
QEMU_SOFTMMU_TARGETS="i386 x86_64"
QEMU_USER_TARGETS="i386 x86_64"
Follow the normal gentoo install guide here:
http://www.gentoo.org/doc/de/handbook/handbook-amd64.xml?part=1&chap=5
Some changes to the gentoo manual (all to be executed in the chroot environment):
- Use lzo to compress kernel
- Use Grub 2
- Modify fstab to use labels
- Build our own initramfs
echo "=sys-boot/grub-2*">>/etc/portage/package.keywords
echo "sys-boot/grub device-mapper">>/etc/portage/package.use
emerge -av grub lzop lvm2 mdadm genkernel
rc-update add lvm boot
rc-update add mdraid boot
Modify /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="dolvm domdadm intel_iommu=on,igfx_off,pass-through vga=791 splash=silent,theme:gentoo console=tty1 quiet libata.ignore_hpa=1 cgroup_enable=memory swapaccount=1"
To build the initramfs use:
genkernel --lvm --mdadm --iscsi --disklabel --install initramfs
Setup fstab:
blkid
/dev/loop0: TYPE="squashfs"
/dev/sda2: UUID="9338e0f6-0ed2-8112-a0e2-840b4d9616de" UUID_SUB="fa5fb4fe-6f65-efe6-5cd3-21e7e6c42976" LABEL="Gentoo-20121221:0" TYPE="linux_raid_member"
/dev/md0: UUID="PoGeVn-q9Sb-T7YD-Ysro-oRDG-pB7f-tXRWzr" TYPE="LVM2_member"
/dev/sdb: LABEL="PENDRIVE" UUID="1105-224F" TYPE="vfat"
/dev/mapper/vg--kvm-boot: LABEL="boot" UUID="251d9d9e-2c38-41db-938d-e25ef56afd3a" TYPE="ext2"
/dev/mapper/vg--kvm-swap: UUID="9d77c5f7-ebc8-4a9d-afa9-cd215489aae8" TYPE="swap"
/dev/mapper/vg--kvm-root: LABEL="root" UUID="7702989f-02c0-48dd-b640-3a921797096b" TYPE="ext4"
Now edit the /etc/fstab based on the information:
UUID="251d9d9e-2c38-41db-938d-e25ef56afd3a" /boot ext2 noatime 1 2
UUID="7702989f-02c0-48dd-b640-3a921797096b" / ext3 noatime 0 1
UUID="9d77c5f7-ebc8-4a9d-afa9-cd215489aae8" none swap sw 0 0
Install GRUB 2
mkdir /boot/grub2
grub-mkconfig -o /boot/grub/grub.cfg
grub-install /dev/sda
Install required software:
emerge -av qemu usbutils bridge-utils usermode-utilities iptables macchanger virt-manager
rc-update add libvirtd default
gpasswd -a qemu kvm
Enable KSM:
echo "echo 1 > /sys/kernel/mm/ksm/run" >/etc/local.d/ksm.start
chmod +x /etc/local.d/ksm.start
Create certificates:
mkdir -p /tmp/certs
cd /tmp/certs
certtool --generate-privkey > cakey.pem
echo "cn = FM-Data" >ca.info
echo "ca" >>ca.info
echo "cert_signing_key" >>ca.info
certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
mkdir -p /etc/pki/CA
cp cacert.pem /etc/pki/CA
certtool --generate-privkey > serverkey.pem
echo "organization = FM-Data" >server.info
echo "cn = kvm.idefix.lan" >>server.info
echo "tls_www_server" >>server.info
echo "encryption_key" >>server.info
echo "signing_key" >>server.info
certtool --generate-certificate --load-privkey serverkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --template server.info --outfile servercert.pem
mkdir -p /etc/pki/libvirt/private
cp serverkey.pem /etc/pki/libvirt/private/
cp servercert.pem /etc/pki/libvirt/
certtool --generate-privkey > clientkey.pem
echo "country = DE" >client.info
echo "state = Bayern" >>client.info
echo "locality = Fuerstenfeldbruck" >>client.info
echo "organization = FM-Data" >>client.info
echo "cn = client1" >>client.info
echo "tls_www_client" >>client.info
echo "encryption_key" >>client.info
echo "signing_key" >>client.info
certtool --generate-certificate --load-privkey clientkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --template client.info --outfile clientcert.pem
cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem
cp clientcert.pem /etc/pki/libvirt/clientcert.pem
rm *
Network bridge:
Edit vi /etc/conf.d/net
bridge_br0="eth0"
brctl_br0="setfd 0 sethello 0 stp off"
config_br0="dhcp"
cd /etc/init.d/
ln -s net.lo net.br0
rc-update del net.eth0
rc-update add net.br0 default
Enable PCI passthrough:
echo "options kvm allow_unsafe_assigned_interrupts=1" >kvm_iommu_map_guest.conf
Add Second Harddisk and Build Raid1
Install sgdisk:
emerge -av sys-apps/gptfdisk
Copy the GPT partition schema from the original disk to the new disk.
The already existing disk is /dev/sda and the new disk is /dev/sdf:
sgdisk -R=/dev/sdf /dev/sda
sgdisk -G /dev/sdf
sgdisk -c 1:"boot2" /dev/sdf
sgdisk -c 2:"kvm2" /dev/sdf
See disk and raid information:
cat /proc/mdstat
blkid
/dev/sdf1: PARTLABEL="boot2" PARTUUID="bea234c8-ce71-4c23-8e67-7faf5d8e50d1"
/dev/sdf2: PARTLABEL="kvm2" PARTUUID="054de73e-7cd6-4c94-860b-3eda62cabc58"
Add the new disk to the raid:
mdadm -a /dev/md126 /dev/disk/by-partuuid/054de73e-7cd6-4c94-860b-3eda62cabc58
Install boot manager:
Install Gentoo as Guest
Download the install-amd64-minimal-20130207.iso and place it in the iso directory:
cd /mnt/isos/
wget http://distfiles.gentoo.org/releases/amd64/autobuilds/current-iso/default/20130207/install-amd64-minimal-20130207.iso
Now start virt-manager and we create there the new virtual machine. I created a lvm partition with 30GB and mounted the iso we downloaded. Then follow the normal gentoo installation guide or continue here.
Prepare Harddisk
fdisk /dev/sda
n
p
1
<ENTER>
+100M
n
p
2
<ENTER>
<ENTER>
t
2
8e
a
1
w
pvcreate /dev/sda2
vgcreate vg-knx /dev/sda2
lvcreate -L4GB -nswap vg-knx
lvcreate -l+100%FREE -nroot vg-knx
mkfs.ext2 -L boot /dev/sda1
mkfs.ext4 -L root /dev/vg-knx/root
mkswap -L swap /dev/vg-knx/swap
swapon /dev/vg-knx/swap
mount /dev/vg-knx/root /mnt/gentoo/
mkdir /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot
cd /mnt/gentoo
Install Gentoo
links http://www.gentoo.org/main/en/mirrors.xml
(download stage3 in releases/autobuilds/current-stage3/default/..../stage3-amd64....tar.bz2)
q
tar xjpf stage3-*.tar.bz2
echo 'MAKEOPTS="-j2"' >>etc/portage/make.conf
mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
mirrorselect -i -r -o >> /mnt/gentoo/etc/portage/make.conf
cp -L /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc none /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) $PS1"
mkdir /usr/portage
emerge-webrsync
eselect news list
eselect news read
eselect profile list
eselect profile set 3
emerge --sync --quiet
cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime
echo "Europe/Berlin" > /etc/timezone
emerge =gentoo-sources-3.0.35 eix genkernel syslog-ng vixie-cron dhcpcd grub vim
rc-update add syslog-ng default
rc-update add vixie-cron default
rc-update add sshd default
Prepare the kernel
SYMLINK="yes"
MAKEOPTS="-j2"
LVM="yes"
DISKLABEL="yes"
BOOTLOADER="grub"
Compile the kernel now with:
cd /usr/src/linux
genkernel all
vi /etc/fstab
LABEL="boot" /boot ext2 noatime 1 2
LABEL="root" / ext4 noatime 0 1
LABEL="swap" none swap sw 0 0
Configure hostname:
vi /etc/conf.d/hostname
hostname="knx.idefix.lan"
Configure network:
vi /etc/conf.d/net
config_eth0="dhcp"
cd /etc/init.d
ln -s net.lo net.eth0
rc-update add net.eth0 default
Locale settings:
vi /etc/conf.d/keymaps
vi /etc/locale.gen
en_US ISO-8859-1
en_US.UTF-8 UTF-8
de_DE ISO-8859-1
de_DE@euro ISO-8859-15
de_DE.UTF-8 UTF-8
locale-gen
vi /etc/env.d/02locale
LANG="de_DE.UTF-8"
LC_COLLATE="C"
env-update && source /etc/profile
Install grub
vi /boot/grub/grub.conf
default 0
timeout 0
splashimage=(hd0,0)/grub/splash.xpm.gz
title Gentoo Linux
root (hd0,0)
kernel /kernel real_root=/dev/vg-knx/root dolvm
initrd /initramfs
grep -v rootfs /proc/mounts > /etc/mtab
grub-install --no-floppy /dev/sda
Setup users
passwd
useradd -m -G users,wheel,audio -s /bin/bash idefix
passwd idefix
rm /stage3-*.tar.bz2*
Reboot the system
exit
cd
umount -l /mnt/gentoo/dev{/shm,/pts,}
umount -l /mnt/gentoo{/boot,/proc,}
reboot
Pass Cine-S2 to virtual machine
Find the device with:
we get:
...
04:00.0 Multimedia controller: Digital Devices GmbH Octopus LE DVB adapter
...
We search for the id of the card:
We get:
Now we create a startup script to free the card before libvirt tries to start the virtual machine.
For this we create a new start script and enable it:
cd /etc/init.d/
echo '#!/sbin/runscript' > pci_passthrough
echo "" >> pci_passthrough
echo "depend() {" >> pci_passthrough
echo " before libvirtd" >> pci_passthrough
echo "}" >> pci_passthrough
echo "" >> pci_passthrough
echo "start () {" >> pci_passthrough
echo " echo "dd01 0003" > /sys/bus/pci/drivers/pci-stub/new_id" >> pci_passthrough
echo " echo 0000:04:00.0 >/sys/bus/pci/devices/0000\:04\:00.0/driver/unbind" >> pci_passthrough
echo " echo 0000:04:00.0 >/sys/bus/pci/drivers/pci-stub/bind" >> pci_passthrough
echo "}" >> pci_passthrough
echo "" >> pci_passthrough
chmod +x pci_passthrough
rc-update add pci_passthrough default
If you reboot your system now, it frees the pci card with the given id before libvirt tries to start the virtual machines.
Snapshot and upgrade the guest, maybe roll back
We have now the following setup.
vgs
VG #PV #LV #SN Attr VSize VFree
boot 1 3 0 wz--n- 148,95g 0
vg-kvm 1 7 0 wz--n- 232,75g 120,30g
videostorage 1 1 0 wz--n- 4,00t 20,00g
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
root boot -wi-a--- 30,00g
swap boot -wi-a--- 2,00g
video1 boot -wi-a--- 116,95g
boot vg-kvm -wi-ao-- 100,00m
freepbx vg-kvm -wi-a--- 19,53g
iso vg-kvm -wi-ao-- 10,00g
knx vg-kvm -wi-ao-- 29,30g
root vg-kvm -wi-ao-- 30,00g
swap vg-kvm -wi-ao-- 4,00g
yavdr vg-kvm -wi-ao-- 19,53g
video0 videostorage -wi-ao-- 3,98t
Create snapshot
We would like to create now a snapshot of the machine yavdr:
Wait till the virtual machine is shutdown completely. Check it with:
Create the snapshot:
lvcreate -L4G -s -n /dev/vg-kvm/yavdr-snapshot /dev/vg-kvm/yavdr
virsh start yavdr
We can see the new snapshot now:
lvs vg-kvm
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
boot vg-kvm -wi-ao-- 100,00m
freepbx vg-kvm -wi-a--- 19,53g
iso vg-kvm -wi-ao-- 10,00g
knx vg-kvm -wi-ao-- 29,30g
root vg-kvm -wi-ao-- 30,00g
swap vg-kvm -wi-ao-- 4,00g
yavdr vg-kvm owi-aos- 19,53g
yavdr-snapshot vg-kvm swi-a-s- 4,00g yavdr 0,05
Roll back to snapshot
We tested now some stuff and we see it does not work.
Stop the virtual machine:
Rollback the lvm to the snapshot (this will destroy the snapshot):
lvconvert --merge /dev/vg-kvm/yavdr-snapshot
Start the VM again:
Destroy the snapshot
If everything is fine, destroy the snapshot:
lvremove /dev/vg-kvm/yavdr-snapshot
Cross Compile under Gentoo
crossdev avr
sudo crossdev --b 2.19.51.0.8 --g 4.4.1 --without-headers --target avr
Atmel Studio 6
Download and install:
Start Atmel Studio 6 and select Tools -> Options. Go to Toolchain Flavour Configuration. Add Flavour and fill in:
Flavour Name: WinAVR 20100110
Toolchain Path: C:\WinAVR-20100110\bin
Make Path: C:\WinAVR-20100110\utils\bin
If you like you can select the new toolchain as default.
To have the possibility to flash our controller with one click and do not have to always go to Device Programming and all other following steps required, I use avrdude from Atmel Studio 6.
Go to Tools -> External Tools. Add a new one with the information:
Title: Flash 8-out
Command: avrdude.exe
Arguments: -c stk600 -p m328p -P usb -U flash:w:Debug/app-8-out-full.hex
Initial directory: $(ProjectDir)
Select Use Output window
Select a toolbar group where you want a flash button and click on the small rectangle button -> Add or Remove Buttons -> Customize. Click Add Command, Tools, External Command 1. Put it with the Move Up and Move Down buttons to the position you want it.
If you now click on the button it start avrdude and flash the hex file directly to the controller.
cd /usr/src/linux
unset CROSS_COMPILE
genkernel --kernel-config=/usr/src/config-idefix-v3 kernel
or
genkernel --no-mrproper --install kernel
I separate the compiling target with the portnumber.
Overview for ports using crosscompile and distcc
CPU |
System |
Port |
x86 |
i686-pc-linux-gnu |
3632 (standard) |
AMD64 |
x86_64-pc-linux-gnu |
3633 |
Distcc with AMD64
We use port 3633 for AMD64 compiling, so we need to adapt the configuration:
Now set the right options in the file /etc/conf.d/distccd:
# /etc/conf.d/distccd: config file for /etc/init.d/distccd
DISTCCD_OPTS=""
# this is the distccd executable
DISTCCD_EXEC="/usr/bin/distccd"
# this is where distccd will store its pid file
DISTCCD_PIDFILE="/var/run/distccd/distccd.pid"
# set this option to run distccd with extra parameters
# Default port is 3632. For most people the default is okay.
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3633"
# Logging
# You can change some logging options here:
# --log-file FILE
# --log-level LEVEL [critical,error,warning, notice, info, debug]
#
# Leaving --log-file blank will log to syslog
# example: --log-file /dev/null --log-level warning
# example: --log-level critical
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
# SECURITY NOTICE:
# It is HIGHLY recomended that you use the --listen option
# for increased security. You can specify an IP to permit connections
# from or a CIDR mask
# --listen accepts only a single IP
# --allow is now mandatory as of distcc-2.18.
# example: --allow 192.168.0.0/24
# example: --allow 192.168.0.5 --allow 192.168.0.150
# example: --listen 192.168.0.2
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/16"
#DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.2"
# set this for niceness
# Default is 15
DISTCCD_NICE="15"
Edit /etc/distcc/hosts:
localhost:3633
or
distcc-config --set-hosts localhost:3633
Then start distcc with:
/etc/init.d/distccd restart
Distcc with X86
I ran here a 64-bit gentoo coompiled for AMD64 (x86_64) so we need to do some configuration to compile for x86.
At first we need to generate a port overlay, edit /etc/make.conf:
# To get crossdev running
PORTDIR_OVERLAY="/usr/local/portage"
Create the new directory:
Install cross-compile environment:
emerge crossdev
crossdev -t i686-pc-linux-gnu
Adapt the configuration:
cd /etc/init.d
cp distccd distccd-x86
Edit /etc/init.d/distccd-x86:
#!/sbin/runscript
# $Header: /var/cvsroot/gentoo-x86/sys-devel/distcc/files/2.18/init,v 1.1 2004/10/12 17:21:43 lisa Exp $
depend() {
need net
use ypbind
}
start() {
[ -e "${DISTCCD_PIDFILE}" ] && rm -f ${DISTCCD_PIDFILE} &>/dev/null
ebegin "Starting distccd"
chown distcc `dirname ${DISTCCD_PIDFILE}` &>/dev/null
TMPDIR="${TMPDIR}" \
PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1:${PATH}" \
/sbin/start-stop-daemon --start --quiet --startas ${DISTCCD_EXEC} \
--pidfile ${DISTCCD_PIDFILE} -- \
--pid-file ${DISTCCD_PIDFILE} -N ${DISTCCD_NICE} --user distcc \
${DISTCCD_OPTS}
eend $?
}
stop() {
ebegin "Stopping distccd"
start-stop-daemon --stop --quiet --pidfile "${DISTCCD_PIDFILE}"
rm -f "${DISTCCD_PIDFILE}"
eend $?
}
cd /etc/conf.d
cp distccd distccd-x86
Now set the right options in the file /etc/conf.d/distccd-x86:
# /etc/conf.d/distccd: config file for /etc/init.d/distccd
DISTCCD_OPTS=""
# this is the distccd executable
DISTCCD_EXEC="/usr/bin/distccd"
# this is where distccd will store its pid file
DISTCCD_PIDFILE="/var/run/distccd/distccd-x86.pid"
# set this option to run distccd with extra parameters
# Default port is 3632. For most people the default is okay.
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3632"
# Logging
# You can change some logging options here:
# --log-file FILE
# --log-level LEVEL [critical,error,warning, notice, info, debug]
#
# Leaving --log-file blank will log to syslog
# example: --log-file /dev/null --log-level warning
# example: --log-level critical
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
# SECURITY NOTICE:
# It is HIGHLY recomended that you use the --listen option
# for increased security. You can specify an IP to permit connections
# from or a CIDR mask
# --listen accepts only a single IP
# --allow is now mandatory as of distcc-2.18.
# example: --allow 192.168.0.0/24
# example: --allow 192.168.0.5 --allow 192.168.0.150
# example: --listen 192.168.0.2
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/16"
#DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.2"
# set this for niceness
# Default is 15
DISTCCD_NICE="15"
To configure an i686 computer to use our AMD64 for compiling edit the /etc/distcc/hosts on the i686 computer:
192.168.0.151
or
distcc-config --set-hosts localhost 192.168.0.151
Use localhost only if localhost is fast enough elsewhere omit it.
Start distcc-x86 now with:
/etc/init.d/distccd-x86 restart
To start it at computer restart enter:
rc-update add distccd-x86 default
Get status
View which computer compile on our:
DISTCC_DIR="/var/tmp/portage/.distcc" distccmon-text 1
DISTCC_DIR="/var/tmp/portage/.distcc" distccmon-gui
Enable distcc with Gentoo
Edit /etc/make.conf to enable distcc and ccache for portage:
# for 7 CPUs or PCs (CPU*2 +1)
MAKEOPTS="-j15"
FEATURES="distcc ccache"
CCACHE_SIZE="2G"
eibd for gentoo
There is already a port available which can be used:
layman -f -o ftp://scponly:scponly@erazor-zone.de/portage/layman.xml
layman -a erazor -o ftp://scponly:scponly@erazor-zone.de/portage/layman.xml
emerge -av eibd
All the tools are not working, so I recompiled the current head version and installed it over the already installed gentoo portage.
git clone http://www.auto.tuwien.ac.at/~mkoegler/git/bcusdk.git
cd bcusdk/
autoreconf -i
./configure --enable-onlyeibd --disable-ft12 --disable-pei16 --disable-tpuart --disable-pei16s --disable-tpuarts --enable-eibnetip --enable-eibnetiptunnel --enable-eibnetipserver --enable-usb --disable-groupcache --prefix=/usr
make
make install
Layman can be used to use external portage directories via svn and more different programs and integrate all into portage.
Using Layman
At first we need to install layman:
Create Own Layman Repository
At first create a virtual host in your apache config and place there a config file for layman.
overlay.xml
Now add to the file /etc/layman/layman.conf the line:
overlays : http://www.gentoo.org/proj/en/overlays/layman-global.txt
http://overlay.idefix.lan/overlay.xml
Edit /etc/make.conf
source /usr/portage/local/layman/make.conf
Now we create the xml file on the server:
<?xml version="1.0" ?>
<layman>
<overlay
contact = "idefix@fechner.net"
name = "idefix"
src = "http://overlay.idefix.lan/"
type = "svn"
status = "official">
<link>
http://overlay.idefix.lan/svn/overlay/trunk/
</link>
<description>
Idefix overlay.
</description>
</overlay>
</layman>
To move an existing installation to a lvm2 the following steps a necessary:
Build initramfs using dracut
Enable it:
echo "sys-fs/lvm2 static" >>/etc/portage/package.use
echo "sys-fs/mdadm static" >>/etc/portage/package.use
echo "sys-apps/busybox static" >>/etc/portage/package.use
echo "media-libs/freetype static-libs" >>/etc/portage/package.use
echo "sys-kernel/dracut" >> /etc/portage/package.keywords
echo "media-libs/freetype" >> /etc/portage/package.keywords
echo "media-gfx/splashutils" >> /etc/portage/package.keywords
echo "sys-kernel/dracut device-mapper" >> /etc/portage/package.use
echo 'DRACUT_MODULES="gensplash lvm mdraid"' >> /etc/make.conf
emerge -av --autounmask-write sys-kernel/dracut
dispatch-conf
emerge -av sys-kernel/dracut
Generate it with:
dracut "" `uname -r`
ln -s /boot/initramfs-`uname -r`.img /boot/initramfs.img
Modify your grub config:
title Gentoo Linux
root (hd0,0)
kernel /vmlinuz root=/dev/vg/root-new
initrd /initramfs.img
Move root to LVM2
At first we have to backup the complete root partition to a backup partition.
You can do this by execute:
find / -depth -xdev -print0 |cpio --null --sparse -pVd /newroot/
This will copy all files from / to /newroot excluding all external mount points.
Adapt the /etc/fstab to point to the correct root partition, in this case:
/dev/vg/root-new / ext4 defaults 0 1
Create the real root
After we moved our current root to a lvm2 and booted it from there we can completely destroy the old boot harddisk and can recreate it from scratch.
I increased the /boot partition to 100MB and the rest is used for LVM2.
Use fdisk to create a 100MB partition and make it bootable, create the lvm partition as a primary partition, it should look like this:
Geraet boot. Anfang Ende Bloecke Id System
/dev/sda1 * 2048 206847 102400 83 Linux
/dev/sda2 206848 312581807 156187480 8e Linux LVM
As next mount /dev/sda1 to /boot and install grub:
mke2fs /dev/sda1
mount /dev/sda1 /boot
grub
root (hd0,0)
setup (hd0)
exit
At first we have to create a PV on the harddisk:
New we can create a new volume group.
Now we create a logical volume for the swap partition:
lvcreate -L2G -nswap boot
mkswap /dev/boot/swap
swapon /dev/boot/swap
Next is create to new partition for the gentoo system and use the rest for VDR:
lvcreate -L30G -nroot boot
mkfs.ext4 /dev/boot/root
lvcreate -l100%FREE -nvideo1 boot
mkfs.ext4 /dev/boot/video1
Now we copy the backup back to the new root partition:
mount /dev/boot/root /newroot/
find / -depth -xdev -print0 |cpio --null --sparse -pVd /newroot/
Adapt the /etc/fstab:
/dev/sda1 /boot ext2 defaults 1 2
/dev/boot/swap none swap sw 0 0
/dev/boot/root / ext4 defaults 0 1
/dev/boot/video1 /video1 ext4 defaults 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/vg/video0 /video0 ext4 defaults 1 1
And modify the /boot/grub/grub.conf:
title=Gentoo Linux
root (hd0,0)
kernel /vmlinuz root=/dev/boot/root
initrd /initramfs.img
Reboot your system and enjoy your new structure.
Initramfs with genkernel
genkernel --lvm --mdadm --dmraid --iscsi --disklabel initramfs
Tips around portage
USE Flags
Get description for the USE-FLAGS install
then type:
For details on USE flags:
less /usr/portage/profiles/use.desc
Display all version from one package
Deinstall a portage
emerge --unmerge media-libs/faad2
Installing QEmu
I use QEmu to have a emulated environment to test Xenomai applications without crashing the main system.
We need to enable sdl for qemu to have all display output available, edit /etc/portage/package.use:
app-emulation/qemu-softmmu sdl
To install QEmu on Gentoo we need at first gcc 3.x:
emerge =gcc-3.4.6*
gcc-config i686-pc-linux-gnu-3.4.6
source /etc/profile
emerge app-emulation/qemu
gcc-config i686-pc-linux-gnu-4.1.1
source /etc/profile
Prepare Linux for Qemu
Do as root:
echo 1024 > /proc/sys/dev/rtc/max-user-freq
Compile kernel with tun support.
CONFIG_TUN=m
CONFIG_BRIDGE=m
Install everything for bridging:
emerge net-misc/bridge-utils
emerge sys-apps/usermode-utilities
modprobe tun
modprobe bridge
Note: If you get an error message about unresolved symbols, reboot easily the system then everything should work.
Configure for bridge device now in /etc/conf.d/net:
bridge_add_eth0="br0"
config_eth0=( "null" )
config_br0=( "192.168.0.151/24" )
brctl_br0=( "setfd 0" "sethello 0" "stp off" )
routes_br0=( "default gw 192.168.0.251" )
Add the tun device to your startup config:
cd /etc/init.d
ln -s net.lo net.br0
rc-update add net.br0 default
/etc/init.d/net.eth0 stop
/etc/init.d/net.br0 start
ifconfig br0
ifconfig eth0
Configure Qemu to use a network interface edit /etc/qemu-ifup
#!/bin/sh
#
# ____Address: 192.168.0.1 (guest01)
# ____Netmask: 255.255.255.0
# ___Wildcard: 0.0.0.255
# ____Gateway: 192.168.0.251
#
if test $(sudo /sbin/ifconfig | grep -c $1) -gt 0; then
sudo /sbin/brctl delif br0 $1
sudo ifconfig $1 down
fi
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
sudo /sbin/brctl addif br0 $1
chmod +x /etc/qemu-ifup
Create a persistant tun interface:
Booting OS in Qemu
We want to boot via network so we create first the needed structure in out tftp server.
- Take the file pxelinux.0 from isolinux and copy it to the tftp root directory.
- create a directory pxelinux.cfg
- create the file pxelinux.cfg/default, see below for more details
- copy kernel to zimage
The structure of the directory is:
tftpboot/
|-- pxelinux.0
|-- pxelinux.cfg
| |-- default
| `-- zimage
`-- zimage
The file default has the following input:
DEFAULT qemu
PROMPT 1
TIMEOUT 10
LABEL qemu
KERNEL zimage
APPEND vga=0x314 install=nfs://192.168.0.151/qemu
LABEL local
LOCALBOOT 0
Now configure your dhcp server:
# settings for booting our qemu image
allow booting;
allow bootp;
next-server 192.168.0.251;
filename "pxelinux.0";
mkdir qemu
cd !$
qemu-img create disk.img 4G
qemu -localtime -hda disk.img -boot d -m 256
You should see now some output. If you get the error message
Could not initialize SDL - exiting
Be sure that $DISPLAY is set and execute on the xserver xhost + to allow all hosts to connect to your xserver.
Now download pxe iso from http://rom-o-matic.net/
.
- Choose as nic: ns8390:rtl8029 – [[0x10ec,0x8029]]
- Select ISO bootable image for without legacy floppy emulation
- Click Get ROM
Now we can boot via network with:
qemu -cdrom eb-5.4.2-ns8390.iso -boot d -net tap -net nic,macaddr=52:54:00:12:34:56
Install at first the raid tools:
Load the raid module:
Create partitions on the three hard-disks with fdisk and type fd.
fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd
Create md devices:
New create the raid with:
mdadm --create /dev/md0 --level 5 --raid-devices 3 /dev/sd[[bcd]]1
To see progress on build:
watch -n 1 cat /proc/mdstat
Store raid in config file:
mdadm --detail --scan >> /etc/mdadm.conf
To see more details for raid:
Sending EMail in Case of an Error
Edit the file /etc/mdadm.conf and add there:
MAILADDR idefix@server.idefix.lan
Test email delivery:
In Case of Failure
You can see in /proc/mdstat which device failed:
md0 : active raid5 sdb1[3] sdd1[2] sdc1[1]
2930271872 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
Remove it with:
mdadm -r /dev/md0 /dev/sdb1
Create a partition on the new disk with type 0xFD and add it to the raid with:
mdadm -a /dev/md0 /dev/sdb1
You can see now in /proc/mdstat that the raid is recovering the data:
cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid5 sdb1[3] sdd1[2] sdc1[1]
2930271872 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
[>....................] recovery = 0.8% (12625280/1465135936) finish=302.8min speed=79923K/sec
unused devices: <none>
Create LVW2
emerge -av lvm2
rc-update add device-mapper boot
rc-update add lvm boot
Scan for devices:
vgscan
mdadm -Ac partitions -m 0 /dev/md0
Convert a normal raid to lvm2
At first we create our backup storage. For this create partition on the disks and select as type raid autodetect.
Now we create the raid with:
mdadm --create /dev/md0 --level=stripe --raid-devices=2 /dev/sde1 /dev/sdf1
Now we create the lvm2:
vgscan
vgchange -a y
pvcreate /dev/md0
vgcreate vg /dev/md0
lvcreate -L20G -nyavdr vg
lvcreate -L3T -nbackup-video0 vg
mkfs.ext4 /dev/vg/backup-video0
Now we mount the disks:
mount /dev/vg/backup-video0 /mnt/backup-video0
mount video:/video0 /video0
Now we copy the data:
cd /video0
rsync -av --delete . /mnt/backup-video0/
Online Resize Raid5
Replace the first disk with a new one like it is descriped in case of a disk failure.
Wait till the raid is restored. Repeat that step for every disk in your raid.
Now we have to resize the raid:
You have to wait till the resize is complete, check with:
Now we resize the lvm:
Now we resize the logical volume:
lvresize -l +100%FREE /dev/vg/video0
Now we resize the filesystem, I use ext4 so do:
Add script to startup:
rc-update add postfix default
Show which script is executed
Remove package from startup
rc-update del postfix default
To update the ports enter:
or if a firewall blacks you enter:
To display packages which need an update enter:
emerge --pretend --verbose world
To update all packages where the USE-FLAG has changed:
emerge --update --deep --newuse world
To update the complete system enter:
emerge --update --deep world
To Update the /etc directory
To update dependency execute:
see here
General
I have here an AMD64 but with the 64-bit version of Gentoo I had several problem with some VDR plugins so I went back to the 32-bit version.
To install Gentoo download the livecd and use the GUI installer, see Gentoo documentation how to do it (I used 2006.1).
After the installation is finished boot your new gentoo.
Edit make.conf and add:
Now we must install some packages first which VDR or the plugins I use needs to compile correctly.
emerge --sync
emerge portage
etc-update
emerge gentoolkit eix gentoo-sources mc app-admin/sudo
Now compile the kernel with your DVB drivers and everything else, reboot your new kernel.
Now we install software needed by VDR:
emerge lirc imagemagick sys-libs/libcap media-libs/libmad media-libs/libid3tag media-libs/libvorbis media-libs/libsndfile \
media-libs/libdvdnav media-libs/a52dec dev-libs/boost media-libs/gd cvs subversion
Driver for new Cards
http://mercurial.intuxication.org/hg/s2-liplianin
Compile new Driver
To get the driver:
cd /usr/local/src/
mkdir hvr4000
mkdir -p hvr4000/liblianindvb-test
cd hvr4000/liblianindvb-test
hg init
hg pull http://arvdr-dev.free-x.de:8080/testdvb/
hg update
Compile the driver:
To compile VDR:
cd /usr/local/src/hvr4000/liblianindvb-test/linux/include/linux
ln -s /usr/src/linux/include/linux/compiler.h .
vdpau Support
Make sure you have a current gcc on the system, I used gcc-4.3.4.
gcc-config -l
gcc-config 2
source /etc/profile
I use the following versions:
nvidia 190.53 (install with sh /usr/portage/distfiles/NVIDIA-Linux-x86-190.53-pkg0.run)
kernel 2.6.32-gentoo-r1
vdr 1.7.10
Required libs:
emerge -av media-video/vcdimager
emerge -av media-sound/musepack-tools
Make sure you do not have any xine or xine-lib installed, search with the command and decide to delete necessary files:
cd /usr
find . -name "*xine*"
Download the following files:
xine-lib from hg repository http://hg.debian.org/hg/xine-lib/xine-lib-1.2-vdpau
.
cd /usr/local/src
hg pull http://hg.debian.org/hg/xine-lib/xine-lib-1.2-vdpau
Compile xine-lib:
cd /usr/local/src/xine-lib-1.2-vdpau
./autogen.sh --prefix=/usr --disable-xinerama
make
make install
Compile Plugin for VDR:
cvs -z3 -d:pserver:anonymous@xineliboutput.cvs.sourceforge.net:/cvsroot/xineliboutput co vdr-xineliboutput
Copy the checkout to you vdr/PLUGINS/src folder and compile it with make plugins.
Copy to your /etc/vdr/setup.conf:
xineliboutput.Audio.Compression = 100
xineliboutput.Audio.Delay = -120
xineliboutput.Audio.Headphone = 0
xineliboutput.Audio.SoftwareVolumeControl = 0
xineliboutput.Audio.Speakers = Pass Through
xineliboutput.Audio.Surround = 0
xineliboutput.Audio.Upmix = 0
xineliboutput.Audio.Visualization = goom
xineliboutput.Audio.Visualization.GoomOpts = width=400,height=300,fps=25
xineliboutput.Frontend ======
xineliboutput.Media.BrowseFilesDir = /video0/storage/videos/redeacted
xineliboutput.Media.BrowseImagesDir = /video0
xineliboutput.Media.BrowseMusicDir = /video0/storage/mp3s-server/redeacted
xineliboutput.Media.CacheImplicitPlaylists = 1
xineliboutput.Media.DVD.ArrowKeysControlPlayback = 1
xineliboutput.Media.EnableID3Scanner = 1
xineliboutput.Media.MenuItems = -1
xineliboutput.OSD.AlphaCorrection = 0
xineliboutput.OSD.AlphaCorrectionAbs = 0
xineliboutput.OSD.Blending = 1
xineliboutput.OSD.BlendingLowRes = 0
xineliboutput.OSD.DvbSubtitles = 0
xineliboutput.OSD.ExtSubSize = -1
xineliboutput.OSD.Height = 576
xineliboutput.OSD.HideMainMenu = 0
xineliboutput.OSD.LayersVisible = 4
xineliboutput.OSD.Scaling = 2
xineliboutput.OSD.Size = automatic
xineliboutput.OSD.Width = 720
xineliboutput.Playlist.Album = 1
xineliboutput.Playlist.Artist = 1
xineliboutput.Playlist.Tracknumber = 0
xineliboutput.Post.denoise3d.chroma = 30
xineliboutput.Post.denoise3d.Enable = 0
xineliboutput.Post.denoise3d.luma = 40
xineliboutput.Post.denoise3d.time = 60
xineliboutput.Post.pp.Enable = 0
xineliboutput.Post.pp.Mode = de
xineliboutput.Post.pp.Quality = 3
xineliboutput.Post.unsharp.chroma_amount = 0
xineliboutput.Post.unsharp.chroma_matrix_height = 3
xineliboutput.Post.unsharp.chroma_matrix_width = 3
xineliboutput.Post.unsharp.Enable = 0
xineliboutput.Post.unsharp.luma_amount = 0
xineliboutput.Post.unsharp.luma_matrix_height = 5
xineliboutput.Post.unsharp.luma_matrix_width = 5
xineliboutput.Remote.AllowHttp = 1
xineliboutput.Remote.AllowHttpCtrl = 0
xineliboutput.Remote.AllowRtsp = 1
xineliboutput.Remote.AllowRtspCtrl = 0
xineliboutput.Remote.Iface ======
xineliboutput.Remote.Keyboard = 1
xineliboutput.Remote.ListenPort = 37890
xineliboutput.Remote.LocalIP ======
xineliboutput.Remote.MaxClients = 10
xineliboutput.Remote.Rtp.Address = 224.0.1.9
xineliboutput.Remote.Rtp.AlwaysOn = 0
xineliboutput.Remote.Rtp.Port = 37890
xineliboutput.Remote.Rtp.SapAnnouncements = 1
xineliboutput.Remote.Rtp.TTL = 1
xineliboutput.Remote.UseBroadcast = 1
xineliboutput.Remote.UseHttp = 1
xineliboutput.Remote.UsePipe = 1
xineliboutput.Remote.UseRtp = 0
xineliboutput.Remote.UseTcp = 1
xineliboutput.Remote.UseUdp = 1
xineliboutput.RemoteMode = 1
xineliboutput.Video.AspectRatio = 0
xineliboutput.Video.AutoCrop = 0
xineliboutput.Video.AutoCrop.AutoDetect = 1
xineliboutput.Video.AutoCrop.DetectSubs = 1
xineliboutput.Video.AutoCrop.FixedSize = 1
xineliboutput.Video.AutoCrop.SoftStart = 1
xineliboutput.Video.Brightness = -1
xineliboutput.Video.Contrast = -1
xineliboutput.Video.Decoder.H264 = automatic
xineliboutput.Video.Decoder.MPEG2 = automatic
xineliboutput.Video.Deinterlace = tvtime
xineliboutput.Video.DeinterlaceOptions = method=Linear,cheap_mode=1,pulldown=none,framerate_mode=full,judder_correction=1,use_progressive_frame_flag=1,chroma_filter=0,enabled=1
xineliboutput.Video.HUE = -1
xineliboutput.Video.IBPTrickSpeed = 1
xineliboutput.Video.MaxTrickSpeed = 12
xineliboutput.Video.NoiseReduction = -1
xineliboutput.Video.Overscan = 0
xineliboutput.Video.Saturation = -1
xineliboutput.Video.Sharpness = -1
xineliboutput.Video.SwScale = 0
xineliboutput.Video.SwScale.Aspect = 0
xineliboutput.Video.SwScale.Downscale = 0
xineliboutput.Video.SwScale.Height = 576
xineliboutput.Video.SwScale.Resize = 0
xineliboutput.Video.SwScale.Width = 720
Edit the file ~/.xine/config_xineliboutput
.version:2
audio.device.alsa_default_device:hw:0,3
audio.device.alsa_front_device:hw:0,3
audio.device.alsa_passthrough_device:hdmi:CARD=NVidia,DEV=0
audio.output.speaker_arrangement:Pass Through
audio.synchronization.av_sync_method:resample
video.processing.ffmpeg_thread_count:4
effects.goom.fps:25
effects.goom.height:576
effects.goom.width:720
engine.buffers.video_num_buffers:250
engine.buffers.video_num_frames:22
engine.performance.memcpy_method:mmxext
To test everything, start the X server with:
Start VDR with
Start the display with
/usr/local/bin/vdr-sxfe --post tvtime:use_vo_driver,cheap_mode=0,pulldown=0,use_progressive_frame_flag=1 --fullscreen --reconnect xvdr+tcp://127.0.0.1:37890 --video=vdpau
You should see know a picture on your display.
To start everything automatically copy the vdr-sxfe line into a file /usr/local/bin/start-vdr-sxfe and make it executable.
Change /etc/inittab and add the line:
sxfe:3:respawn:/usr/local/bin/start-vdr-sxfe
VDPAU Support Gentoo Way
Add an overlay:
layman -a vdr-xine
layman -S
eix-sync
Edit /etc/portage/package.unmask
Edit /etc/portage/package.keywords
Install it with:
make sure here that really version 9999 is installed (the mecurial version) and check there in the configure output while compiling that vdpau is shown.
PS3 Remote Control and VDR
Install required software:
emerge -av dev-python/dbus-python dev-python/pygobject net-wireless/bluez
Add bluetooth to start-up:
rc-update add bluetooth boot
/etc/init.d/bluetooth start