Quản Trị Mạng - Trong bài viết trước, các bạn đã được hướng dẫn cách cài đặt và sử dụng OpenVZ trên CentOS 6.0. Sau khi đã quen thuộc với công nghệ OpenVZ, hôm nay chúng ta sẽ tiến hành tạo một template OpenVZ cho Debian Wheezy (Debian Testing), từ đó bạn có thể sử dụng để tạo máy ảo Debian Wheezy trong OpenVZ. Bạn cũng có thể thực hiện hướng dẫn này để tạo template cho Debian Lenny hoặc các phiên bản Ubuntu gần đây.
Chuẩn bị hệ thống Host
Lưu ý các bước này cần thực hiện trên hệ thống máy chủ!
Trước tiên chúng ta tiến hành cài đặt deboostrap cho Wheezy guest:
apt-get install debootstrap
Tiếp theo hãy chắc chắn rằng /vz là một symlink tới /var/lib/vz:
ln -s /var/lib/vz /vz
Bây giờ chúng ta cài đặt phiên bản 64-bit của Debian Wheezy trong thư mục /vz/private/777 (với 777 là container ID của Wheezy guest; bạn có thể thay bằng con số khác nếu muốn).
debootstrap --arch amd64 wheezy /vz/private/777 ftp://ftp.de.debian.org/debian/
Giả sử chúng ta muốn tạo một template cho i386, câu lệnh sẽ như sau:
debootstrap --arch i386 wheezy /vz/private/777 ftp://ftp.de.debian.org/debian/
Hãy chắc chắn rằng bạn sử dụng một mirror Debian gần với mình nhất. Ở đây chúng tôi dùng mirror từ Đức: ftp://ftp.de.debian.org/debian/; bạn có thể thay thế de bằng mã quốc gia của mình, chẳng hạn ftp://ftp.fr.debian.org/debian/ (Pháp) hoặc ftp://ftp.us.debian.org/debian/ (Mỹ).
Sau đó mở /etc/sysctl.conf:
vi /etc/sysctl.conf
Và thêm vào như dưới đây để thiết lập:
[...] ### OpenVZ settings # On Hardware Node we generally need packet # forwarding enabled and proxy arp disabled net.ipv4.conf.default.forwarding=1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.ip_forward=1 # Enables source route verification net.ipv4.conf.all.rp_filter = 1 # Enables the magic-sysrq key kernel.sysrq = 1 # TCP Explict Congestion Notification net.ipv4.tcp_ecn = 0 # we do not want all our interfaces to send redirects net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0
Chạy lệnh:
sysctl -p
để những thay đổi có hiệu lực.
Tiếp theo chúng ta áp dụng một cấu hình OpenVZ cơ bản cho container:
vzctl set 777 --applyconfig basic --save
Một cảnh báo sau đây xuất hiện, hãy bỏ qua nó.
root@server1:~# vzctl set 777 --applyconfig basic --save
WARNING: /etc/vz/conf/777.conf not found: No such file or directory
Saved parameters for CT 777
root@server1:~#
Dòng lệnh cuối cùng đã tạo ra một /etc/vz/conf/777.conf cho nội dung của chúng ta. Tiếp theo cần thêm biến OSTEMPLATE cho nó:
sh -c 'echo OSTEMPLATE=\"debian-7.0\"' >> /etc/vz/conf/777.conf
Bạn có thể thay thế debian-7.0 bởi giá trị thích hợp cho distribution của mình để sử dụng template mới. Ví dụ: debian-6.0 cho Debian Squeeze hoặc ubuntu-11.04 cho Ubuntu 11.04.
Tiếp theo chúng ta thêm một địa chỉ IP miễn phí từ subnet cho container mới và thiết lập ít nhất một nameserver chứa container để truy cập vào Internet. Ở đây chúng tôi đang trong mạng 192.168.0.x, vì vậy sẽ gán 192.168.0.110 cho container, đồng thời sử dụng nameservers của Google (8.8.8.8 và 8.8.4.4):
vzctl set 777 --ipadd 192.168.0.110 --save
vzctl set 777 --nameserver 8.8.8.8 --nameserver 8.8.4.4 --save
Kiểm tra nếu /var/lib/vz/private/777/dev/ptmx tồn tại:
ls -l /var/lib/vz/private/777/dev/ptmx
thì bạn sẽ thấy nội dung sau:
root@server1:~# ls -l /var/lib/vz/private/777/dev/ptmx
crw-rw-rw- 1 root tty 5, 2 Mar 4 12:53 /var/lib/vz/private/777/dev/ptmx
root@server1:~#
Ngược lại, hãy tạo nó bằng cách:
mknod --mode 666 /var/lib/vz/private/777/dev/ptmx c 5 2
Khởi động container:
vzctl start 777
Và nhập vào:
vzctl enter 777
Chuẩn bị Container
Các bước tiếp theo phải được thực hiện trong Container!
Thiết lập biến PATH:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Mở /etc/apt/sources.list:
vi /etc/apt/sources.list
Và làm cho nó trông như thế này:
deb http://ftp.de.debian.org/debian wheezy main contrib deb http://security.debian.org wheezy/updates main contrib
(một lần nữa hãy chắc chắn rằng bạn sử dụng một mirror Debian gần nhất với mình).
Cập nhật gói cơ sở dữ liệu:
apt-get update
Và cài đặt các bản cập nhật mới nhất:
apt-get upgrade
Bây giờ bạn có thể cài đặt toàn bộ các gói mà muốn cung cấp cho template OpenVZ. Thiết lập tối thiểu cho chúng như sau:
apt-get install ssh quota less vim-nox
Gán quyền chính xác cho thư mục /root:
chmod 700 /root
Ngoài ra, Nếu muốn bạn có thể vô hiệu hóa đăng nhập root:
usermod -L root
Tuy nhiên trong bài này chúng tôi vẫn sử dụng root nên bỏ qua lệnh này.
Tiếp theo chúng ta vô hiệu hóa getty, sync() cho syslog và sửa chữa /etc/mtab:
sed -i -e '/getty/d' /etc/inittab
sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/*syslog.conf
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
Loại bỏ những gói không muốn cung cấp cho template:
dpkg --purge modutils ppp pppoeconf pppoe pppconfig module-init-tools
Loại bỏ các liên kết startup hệ thống cho một vài dịch vụ:
update-rc.d-insserv -f klogd remove
update-rc.d-insserv -f quotarpc remove
update-rc.d-insserv -f exim4 remove
update-rc.d-insserv -f inetd remove
Mỗi container được tạo từ template này cần có các cặp key SSH, vì vậy chúng ta sẽ xóa key SSH khỏi container:
rm -f /etc/ssh/ssh_host_*
Rồi tạo một script tự động tạo cặp key SSH cho lần đầu tiên khởi động:
vi /etc/init.d/ssh_gen_host_keys
#!/bin/sh ### BEGIN INIT INFO # Provides: Generates new ssh host keys on first boot # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Generates new ssh host keys on first boot # Description: Generates new ssh host keys on first boot ### END INIT INFO ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N "" ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N "" insserv -r /etc/init.d/ssh_gen_host_keys rm -f \$0
Thực thi script này và thêm các liên kết cho hệ thống startup:
chmod a+x /etc/init.d/ssh_gen_host_keys
insserv /etc/init.d/ssh_gen_host_keys
Tiếp theo cần điều chỉnh lại timezone (múi giờ):
dpkg-reconfigure tzdata
Làm sạch bộ nhớ đệm cho các gói:
apt-get --purge clean
Thoát khỏi container
exit
Dọn dẹp, tạo Template và thử nghiệm
Các bước này phải thực hiện trên hệ thống máy chủ!
Bây giờ chúng ta sẽ loại bỏ IP address, nameservers, và hostname từ container:
vzctl set 777 --ipdel all --save
cat /dev/null > /vz/private/777/etc/resolv.conf
rm -f /vz/private/777/etc/hostname
Dừng các container:
vzctl stop 777
Chuyển tới thư mục container:
cd /vz/private/777
Tạo template:
tar --numeric-owner -zcf /vz/template/cache/debian-7.0-amd64-minimal.tar.gz .
(Lưu ý không được bỏ qua dấu chấm ở cuối lệnh).
Xem trong thư mục /vz/template/cache bạn sẽ tìm thấy template mới.
ls -lh /vz/template/cache
root@server1:/vz/private/777# ls -lh /vz/template/cache
total 194M
-rw-r--r-- 1 root root 80M Feb 7 2011 debian-6.0-amd64-minimal.tar.gz
-rw-r--r-- 1 root root 114M Sep 1 22:55 debian-7.0-amd64-minimal.tar.gz
root@server1:/vz/private/777#
Vậy là bạn đã tạo ra một template OpenVZ đầu tiên.
Bây giờ chúng ta sẽ tạo container từ template này để thử nghiệm. Ví dụ dùng ID 888:
vzctl create 888 --ostemplate debian-7.0-amd64-minimal
Khởi động nó:
vzctl start 888
Và kiểm tra xem có chạy thành công hay không bằng cách xem danh sách tiến trình của nó. Nếu không có danh sách nào chứng tỏ bạn đã thất bại.
vzctl exec 888 ps ax
root@server1:/vz/private/777# vzctl exec 888 ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 init [2]
316 ? Sl 0:00 /usr/sbin/rsyslogd -c5
326 ? Ss 0:00 /usr/sbin/cron
335 ? Ss 0:00 /usr/bin/dbus-daemon --system
344 ? Ss 0:00 /usr/sbin/sshd
358 ? Rs 0:00 ps ax
root@server1:/vz/private/777#
Sau khi kiểm tra hoạt động, chúng ta cho dừng lại và loại bỏ container thử nghiệm:
vzctl stop 888
vzctl destroy 888
rm /etc/vz/conf/888.conf.destroyed
Nếu không cần đến container nữa, tốt nhất hãy loại bỏ nó.
cd
vzctl destroy 777
rm /etc/vz/conf/777.conf.destroyed
Nếu bạn muốn sử dụng template mới làm mặc định cho template khi tạo container (để không còn phải xác định --ostemplate debian-7.0-amd64-minimal trong lệnh vzctl create), có thể chỉnh sửa biến DEF_OSTEMPLATE trong /etc/vz/vz.conf:
vi /etc/vz/vz.conf
[...] DEF_OSTEMPLATE="debian-7.0-amd64-minimal" [...]
Các link tham khảo trong bài:
OpenVZ: http://openvz.org/
Debian: http://www.debian.org/