Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

26 tháng 4, 2015

Các thủ thuật trên Postgres (26/04/2015)

Bài viết này tôi nghiệm ra sau một số lần làm việc trên cơ sở dữ liệu Postgres.
Nó chỉ mang tính kinh nghiệm chứ không tập trung vào vấn đề kỹ thuật.
Tất cả các nội dung đều đã đảm bảo là hoạt động chính xác như tác giả mong muốn.
1. Làm thế nào để copy dữ liệu từ 1 bảng sang 1 bảng khác.
Trên công cụ pgAdmin đi kèm bộ cài postgress (Link download) bạn có thể dùng query tool để chạy lệnh sau:
INSERT INTO table_name
         [ ( column_name [, ...] ) ]
         query
Ví dụ:
INSERT INTO books (id, title, author_id, subject_id)
SELECT nextval('book_ids'), title, author_id, subject_id         
FROM book_queue WHERE approved;
Xem thêm tại: http://www.commandprompt.com/ppbook/x5504
Phần Insert from other tables
2. Cast kiểu giá trị trong postgres
Để cast từ string sang integer trong postgres ta dùng hàm cast theo cấu trúc sau:
cast( var1 as int)
Nếu muốn xử lý trong trường hợp xâu là rỗng (không phải null) thì dùng lệnh sau:
cast( nullif(var1, '') as int)
3. Sinh chuỗi UUID cho bảng trong Postgres
Để sinh chuỗi UUID cho bảng trong Postgres ta sử dụng extension đi kèm bộ cài.
Để kiểm tra xem extension này có đang chạy không ta thử bằng truy vấn sau:
Select uuid_in(md5(random()::text || now()::text)::cstring);
Nếu có kết quả đầu ra là một uuid thì ok, nếu không thì phải cài extension này bằng lênh:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Xem thêm

05 tháng 3, 2015

Sinh key bằng OpenSSL trên Ubuntu

1. Tạo Private key
Chạy lệnh sau:
openssl genrsa -des3 -out www.example.com.key 1024
Trong đó:
  • www.example.com.key: đầu ra của lệnh, là key cần sinh
  • 1024: là độ dài của key
2.  Tạo CSR từ private key vừa sinh ra:
Chạy lệnh:
openssl req -new -key www.example.com.key -out www.example.com.csr
Trong đó:
  • www.example.com.key : là private key được sinh ở phần 1
  • www.example.com.csr: là đầu ra của lệnh
3. Tạo Self-Signed SSL Certificate
Chạy lệnh sau:
openssl x509 -req -days 365 -in www.example.com.csr -signkey www.example.com.key -out www.example.com.crt
Trong đó:
  • 365: là số ngày hiệu lực của chứng chỉ.
  • www.example.com.csr: là csr sinh ra ở bước 2.
  • www.example.com.key: là private key sinh ra ở bước 1.

26 tháng 12, 2014

Whitelist, blacklist trong Zimbra

Bài viết này tôi sẽ tập trung vào việc hướng dẫn các bạn các cách thiết lập whitelist và blacklist trong phiên bản Zimbra 8.x
1. Hướng dẫn cách đưa địa chỉ thư local vào whitelist.
Để đưa tên miền nội bộ vào whitelist (Không bị đưa vào thư mục spam) ta làm như sau:
- Giả sử tên miền nội bộ có tên là domain.com
- Ta thêm dòng sau vào trong tập tin /opt/zimbra/conf/amavisd.conf.in:
"domain.com" => -10.0,
- Thêm nội dung sau vào tập tin /opt/zimbra/conf/amavis.conf.in:
read_hash(\%whitelist_sender, ‘/opt/zimbra/whitelist’);
read_hash(\%blacklist_sender, ‘/opt/zimbra/blacklist’);
read_hash(\%spam_lovers, ‘/opt/zimbra/spamlovers’);

- Tạo tập tin /opt/zimbra/whitelist với nội dung:
domain.com
- Thêm vào tập tin /opt/zimbra/conf/spamassassin/local.cf nội dung sau:
trusted_networks your_ip
Lưu ý thay your_ip bằng ip tương ứng của bạn
- Khởi động lại các dịch vụ bằng lênh sau:
zmmtactl restart
zmamavisdctl restart
zmcontrol restart
2. Đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam.
Để đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam (Không bị kiểm tra nữa) ta làm như sau:
- Chỉnh nội dung tham số amavis_originating_bypass_sa thành true và chạy lệnh zmamavisdctl restart
- Một khi đã được bật, tất cả các thư được gửi từ địa chỉ nằm trong dải trustednetwork sẽ không bị đưa qua bộ lọc nữa.
Xem thêm tại đây
 

28 tháng 10, 2014

Các plugin tốt dành cho Notepad++

1. Compare:
Được sử dụng để so sánh 2 văn bản.
Plugin sẽ hỗ trợ đánh dấu các vị trí có sự khác biêt: bị xóa, nội dung không khớp, có nội dung mới,...
2. JSTool
Là công cụ hỗ trợ thao tác với các dữ liệu có định dạng JSON.
Tool sẽ giúp người lập trình định dạng lại dữ liệu để thuận tiện cho việc thao tác.
3. XML Tools
Là công cụ hỗ trợ định dạng lại dữ liệu XML để thuận tiện cho người phát triển.
4. Plugin Manager
Là công cụ hỗ trợ việc tìm kiếm và cài đặt các plugin khác nhau cho Notepad++
5. MIME Tools
Là công cụ hỗ trợ thao tác với các dữ liệu theo chuẩn MIME.
Chức năng của nó bao gồm: encode/decode chuẩn base64,...

13 tháng 9, 2014

fstab trong Linux

Fstab là gì? Hiểu nôm na nó là một tập tin hỗ trợ việc quản lý gắn kết (mount) và sử dụng các phân vùng của hệ điều hành.
Trong bài viết này, tôi sẽ giới thiệu cho bạn cách để làm chủ tập tin cấu hình này, tất nhiên là chỉ với những kiến thức nằm trong tầm hiểu biết của cá nhân tôi.
Cấu trúc chung của một fstab bao gồm các dòng có nội dung như sau:

[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]

Trong đó:
Device: là thiết bị hoặc phân vùng (có thể là đường dẫn của tập tin đại diện hoặc UUID của đối tượng), device được ở đây còn có thể là thiết bị mạng, phân vùng chia sẻ,...
Có thể xem thông tin UUID của thiết bị bằng lệnh:  sudo blkid
Một ổ phân vùng thường có đường dẫn dạng: /dev/sdxy
 Hoặc có dạng LABEL=label
Hoặc các dạng ổ mạng, chia sẻ:
  • Samba: //server/share
  • NFS: //server:/share
  • SSHFS : sshfs#user@server:/share
Mount point: địa chi gắn kết thiết bị, ví dụ /opt/data/
File System Type: định dạng của thiết bị, có thể là:
  • auto
  • vfat: dành cho các phân vùng có định dạng FAT
  • ntfs, ntfs-3g: dành cho các phân vùng có định dạng NTFS
  • ext2, ext3, ext4, jfs, reiserfs
  • udf, iso9660: dành cho các ổ đĩa CD, DVD,
  • swap.
Options: các tùy chọn áp dụng trên phân vùng, được phân cách bằng dấu phẩy (,)
  •  sync/async: tất cả các thao tác đọc, ghi trên thiết bị phải ở dạng đồng bộ/bất đồng bộ
  • auto: tự động gắn kết phân vùng khi khởi động hệ điều hành.
  • noauto: không tự động gắn kết phân vùng khi khởi động hệ điều hành.
  • dev/nodev: tùy chọn này hiểu nôm na là cho phép hoặc không cho phép coi một node nằm ngoài thư mục /dev/ là một thiết bị (ví dụ nếu dùng nodev thì hệ điều hành sẽ coi việc định nghĩa thiết bị tại đường dẫn /home/dev/sda là bất hợp pháp).
  • exec/noexec: cho phép hoặc không cho phép thực thi một tập tin có quyền exec trên thiết bị này.
  • suid/nosuid: cho phép hoặc không cho phép các thao tác với các bit suid hoặc sgid
  • ro: thiết bị ở dạng chỉ đọc.
  • rw: thiết bị ở dạng đọc và ghi.
  • user: cho phép người dùng có thể gắn kết ổ này, tùy chọn này sẽ tự động thực thi các tùy chọn rw, suid, exec, auto, nouser và async
  • nouser: chỉ cho phép người dùng root gắn kết ổ, tùy chọn này tương ứng với tùy chọn defaults.
  • defaults: bao tương ứng với các tùy chọn rw, suid, dev, exec, auto, nouser, async.
  • _netdev: đây là một thiết bị mạng, chỉ thực hiện gắn kết sau khi khởi động card mạng. Chỉ có hiệu lực với các định dạng nfs và fstype.
Dump: bật hoặc tắt chế độ backup cho ổ đĩa, có giá trị là 0 - tắt hoặc 1 - bật.
Pass: định nghĩa thứ tự để ứng dụng fsck kiểm tra thiết bị nếu gặp lỗi trong quá trình khởi động, thường sẽ là 2, 1 chỉ nên dùng cho phân vùng root, 0 có nghĩa là tắt
Dưới đây là một ví dụ về nội dung tập tin fstab:

# /etc/fstab: static file system information.
#
#                

proc  /proc  proc  defaults  0  0
# /dev/sda5
UUID=be35a709-c787-4198-a903-d5fdc80ab2f8  /  ext3  relatime,errors=remount-ro  0  1
# /dev/sda6
UUID=cee15eca-5b2e-48ad-9735-eae5ac14bc90  none  swap  sw  0  0

/dev/scd0  /media/cdrom0  udf,iso9660  user,noauto,exec,utf8  0  0
Và đây là một ví dụ về tập tin fstab quản lý một thiết bị mạng:
# FAT ~ Linux calls FAT file systems vfat)
# /dev/hda1
UUID=12102C02102CEB83  /media/windows  vfat auto,users,uid=1000,gid=100,dmask=027,fmask=137,utf8  0  0

# NTFS ~ Use ntfs-3g for write access (rw) 
# /dev/hda1
UUID=12102C02102CEB83  /media/windows  ntfs-3g  auto,users,uid=1000,gid=100,dmask=027,fmask=137,utf8  0  0

# Zip Drives ~ Linux recognizes ZIP drives as sdx'''4'''

# Separate Home
# /dev/sda7
UUID=413eee0c-61ff-4cb7-a299-89d12b075093  /home  ext3  nodev,nosuid,relatime  0  2

# Data partition
# /dev/sda8
UUID=3f8c5321-7181-40b3-a867-9c04a6cd5f2f  /media/data  ext3  relatime,noexec  0  2

# Samba
//server/share  /media/samba  cifs  user=user,uid=1000,gid=100  0  0
# "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file
# "share" = name of the shared directory
# "user" = your samba user
# This set up will ask for a password when mounting the samba share. If you do not want to enter a password, use a credentials file.
# replace "user=user" with "credentials=/etc/samba/credentials" In the credentials file put two lines
# username=user
# password=password
# make the file owned by root and ro by root (sudo chown root.root /etc/samba/credentials && sudo chmod 400 /etc/samba/credentials)

# NFS
Server:/share  /media/nfs  nfs  rsize=8192 and wsize=8192,noexec,nosuid
# "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file
# "share" = name of the shared directory

#SSHFS
sshfs#user@server:/share  fuse  user,allow_other  0  0
# "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file
# "share" = name of the shared directory

14 tháng 8, 2014

HA (High Avaibility) trong Linux với Heartbeat

Bài viết này tôi chỉ tập trung vào giải thích nguyên tắc hoạt động của Heartbeat khi được sử dụng để xây dựng giải pháp HA trên môi trường Linux.
Trước khi đi vào bài viết, có lẽ bạn nên xem qua bài viết IP ảo trong môi trường Linux để biết thêm một số khái niệm.
Về cơ bản, nguyên tắc hoạt động của Heartbeat là:

  • Theo dõi trạng thái của các máy chủ thành phần.
  • Xác định một máy chủ thành phần gặp sự cố thông qua cơ chế tương tự như "ping" - ping không thấy thì coi như chết.
  • Nếu máy chủ chính gặp sự cố, Heartbeat sẽ tiến hành gọi dịch vụ thay thế trên máy chủ dự phòng.
Phần dưới đây tôi đi sâu vào chi tiết một số vấn đề kỹ thuật của hệ thống, bạn nào muốn biết cách cài đặt và sử dụng Heartbeat thì xem thêm tại bài viết http://www.linuxnix.com/2010/01/heartbeat-clustering.html
Giả sử ta có 2 máy chủ thành phần là A và B.
A có 2 card mạng:
eth0 - 10.0.0.10
eth1 - 192.168.1.2
B có 2 card mạng:
eth0 - 10.0.0.11
eth1 - 192.168.1.3
Ta cho hai card mạng eth1 của A và B thông với nhau để thực hiện nhiệm vụ đồng bộ dữ liệu (do DRBD thực hiện) đồng thời đây cũng là card mạng mà Heartbeat sử dụng để kiểm tra dịch vụ.
Hai card mạng eth0 kết nối ra internet.
Người dùng bên ngoài sẽ sử dụng dịch vụ tại địa chỉ IP 10.0.0.12 ( Bạn lưu ý thông số này và thông số của 2 card eth0 của 2 máy nhé )
Khi chạy Heartbeat, hệ thống sẽ tiến hành tạo ra một địa chỉ IP ảo là 10.0.0.12 cho hệ thống. Giả sử ta thiết lập cho nó hoạt động với card mạng eth0. Khi đó nếu ta gõ lệnh ifconfig eth0 thì sẽ thấy như sau:
Eth0:0 Link encap:Ethernet HWaddr 00:02:A5:4C:AF:8E
inet addr:10.0.0.12 Bcast:10.77.231.255 Mask:255.255.248.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0×5000 Memory:f7fe0000-f8000000

Như vậy, tại một thời điểm, Heartbeat sẽ chỉ gán địa chỉ IP này cho một máy trong cụm máy chủ HA, nếu máy chủ chính gặp lỗi nó sẽ chuyển địa chỉ này sang máy chủ dự phòng. ( Có một điểm tôi thắc mắc nhưng chưa xác nhận qua thực tế là liệu Heartbeat có thể hoạt động với các máy chủ có một card mạng hay không? - Bạn đọc nào có thời gian thử xác nhận lại giúp tôi xem.)

07 tháng 7, 2014

Một số ví dụ về cấu hình sử dụng log4j

Lưu ý, nội dung bài viết chỉ sử dụng cho mục đích tác giả tham khảo  cho các lần sử dụng sau vì lý do có nhiều thứ quá tác giả không nhớ hết được nên tự ghi note ra đây. Bạn đọc nào thấy hữu ích thì có thể đọc còn không thì vui lòng bỏ qua nhé.

Khi sử dụng log4j, tôi chủ yếu tập trung sử dụng 2 tính năng là ghi ra màn hình console hoặc ghi ra tập tin.

Để sử dụng log4j trong java, bạn tạo tập tin log4j.properties và đặt nó vào thư mục gốc của package (đơn giản là tạo file và dán nó vào thư mục src).

Để log4j ghi thông tin ra màn hình bạn cấu hình như sau:
# Root logger option
log4j.rootLogger=INFO, stdout
 
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Trong đó INFO là cấp độ ghi log, stdout để báo cho log4j ghi thông tin ra màn hình.

Để log4j ghi thông tin ra tập tin bạn cấu hình như sau:
# Root logger option
log4j.rootLogger=INFO, file
 
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
 
#Redirect to Tomcat logs folder
#log4j.appender.file.File=${catalina.home}/logs/logging.log
 
log4j.appender.file.File=C:\\logigng.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Trong đó, INFO là cấp độ ghi log, và file để báo cho log4j ghi thông tin ra tập tin.

Bạn có thể tham khảo thêm thông tin về cách cấu hình log4j tại đường link sau:
http://www.tutorialspoint.com/log4j/log4j_configuration.htm
http://logging.apache.org/log4j/1.2/manual.html