Saturday, July 20, 2013

Cấu hình file /etc/fstab để quản lý việc mount thiết bị trong Linux

Trong Linux, file fstab nằm tại thư mục /etc. Bài viết này sẽ tìm hiểu nội dung và cách chỉnh sửa thông tin trong file này và ngụ ý rằng bạn đã biết cơ bản về lệnh mount (xem lại bài “Làm sao để mount/unmount filesystem trong Linux”).
1.     Giới thiệu
File cấu hình /etc/fstab chứa thông tin về các thiết bị (phân vùng ổ cứng, CD/DVD, USB, ISO image…) trên máy tính bao gồm:
+ Đường dẫn tới file đại diện cho thiết bị.
+ Mount point: cho biết thiết bị được mount vào thư mục nào.
+ Các tùy chọn (option): chỉ ra thiết bị được mount như thế nào?
v.v..
Nếu bạn không thể truy cập các phân vùng dành cho Windows (NTFS, FAT), hoặc không thể mount ổ DVD, ghi dữ liệu vào USB, đọc file từ ổ mềm… thì có thể chip nhớ trên thiết bị bị lỗi hoặc cũng có thể bạn đã cấu hình file fstab không đúng cách!
fstab là file dạng văn bản (plain text), vì thế bạn có thể mở và chỉnh sửa nó sử dụng bất kỳ công cụ Text Editor nào với điều kiện bạn phải có đặc quyền root để lưu lại những thay đổi. Nếu bạn đang đăng nhập với tài khoản người dùng thông thường thì có thể sử dụng 2 lệnh suhoặc sudo để tạm thời chuyển sang đặc quyền root.
2.     Cấu trúc của file /etc/fstab
Vì mỗi hệ thống có các thiết bị khác nhau nên thông tin trong file fstab ở mỗi máy cũng khác nhau. Nhưng về cơ bản, khi bạn nắm được định dạng chung của fstab thì không có gì khó khăn khi xem thông tin trong file này trên các hệ thống khác. Khi lệnh mount được thực thi, hệ thống sẽ đọc thông tin trong file fstab để đưa ra cách xử lý tương ứng. Đây là 1 ví dụ về nội dung của file:
Như bạn thấy, mỗi dòng trong file fstab chứa thông tin về một thiết bị. Các cột ở mỗi hàng được phân cách bởi khoảng trắng. Thứ tự các dòng là không quan trọng. Sau đây phần giải thích kỹ hơn ý nghĩa của từng cột:
+ Cột 1: cho biết loại thiết bị (phân vùng, CD/DVD, USB, ISO image…). Đồng thời cũng cho biết đường dẫn tới file đại diện cho thiết bị (device file) . Trong Linux, mọi tài nguyên phần cứng lẫn phần mềm đều được xem là file, các device file thường nằm ở thư mục /dev
+ Cột 2: đường dẫn của mount point, là một thư mục trống được tạo sẵn trong cây thư mục. Khi gõ lệnh mount, nếu bạn không chỉ định rõ mount point thì đây là mount point mặc định cho thiết bị ở cột 1. Thư mục chứa mount point thường là /mnt hay /media , mặc dù bạn có thể mount thiết bị vào bất cứ thư mục trống nào.
+ Cột 3: là kiểu filesystem của thiết bị. Linux hỗ trợ nhiều kiểu filesystem, dưới đây là 1 số filesystem phổ biến:
  • Ext2 và Ext3: điểm khác biệt lớn nhất giữa 2 loại filesystem này là ext3 hỗ trợ tính năngjournaling, tức là khi bạn tắt máy không đúng cách (do cúp điện đột ngột, hệ thống bị treo nên phải nhấn nút khởi động lại…) thì khả năng mất mát dữ liệu ở mức thấp, đồng thời hệ điều hành sẽ không phải tốn thời gian để kiểm tra, tìm lỗi trên filesystem trong lần khởi động kế tiếp.
  • ReiserFS: cũng hỗ trợ tính năng journaling nhưng có thêm nhiều tính năng nổi trội hơn so với ext3. Ngày nay ext3, ReiserFS được chọn là filesystem mặc định trên nhiều bản phân phối Linux.
  • swap: phân vùng làm không gian bộ nhớ ảo, dùng để bổ sung thêm bộ nhớ cho hệ thống khi hệ điều hành phát hiện việc thiếu hụt bộ nhớ RAM.
  • Vfat (FAT16, FAT32) và NTFS: đây là các filesystem được Windows hỗ trợ.
  • nfs: dành cho các tài nguyên ở xa, được chia sẻ qua mạng sử dụng NFS
  • auto: đây không phải là 1 filesytem. Nó có nghĩa là hệ thống sẽ tự động nhận diện loại filesystem của thiết bị khi thiết bị đó được mount.
+ Cột 4: là các tùy chọn khi mount.
Nếu có nhiều tùy chọn thì chúng được phân cách bởi dấu phẩy. Dưới đây là 1 số tùy chọn đáng chú ý:
  • auto: tự động mount thiết bị khi máy tính khởi động.
  • noauto: không tự động mount, nếu muốn sử dụng thiết bị thì sau khi khởi động vào hệ thống bạn cần chạy lệnh mount.
  • user: cho phép người dùng thông thường được quyền mount.
  • nouser: chỉ có người dùng root mới có quyền mount.
  • exec: cho phép chạy các file nhị phân (binary) trên thiết bị.
  • noexec: không cho phép chạy các file binary trên thiết bị.
  • ro (read-only): chỉ cho phép quyền đọc trên thiết bị.
  • rw (read-write): cho phép quyền đọc/ghi trên thiết bị.
  • sync: thao tác nhập xuất (I/O) trên filesystem được đồng bộ hóa.
  • async: thao tác nhập xuất (I/O) trên filesystem diễn ra không đồng bộ.
  • defaults: tương đương với tập các tùy chọn rw, suid, dev, exec, auto, nouser, async
+ Cột 5 là tùy chọn cho chương trình dump, công cụ sao lưu filesystem. Điền 0: bỏ qua việc sao lưu, 1: thực hiện sao lưu.
+ Cột 6 là tùy chọn cho chương trình fsck, công cụ dò lỗi trên filesystem. Điền 0: bỏ qua việc kiểm tra, 1: thực hiện kiểm tra
Kết luận:
File /etc/fstab cung cấp các chỉ dẫn cho hệ điều hành trong việc nhận diện, quản lý việc mount các thiết bị. Đồng thời việc cấu hình lại file fstab cũng giúp ích cho bạn trong việc giảm bớt thời gian mount thiết bị bằng lệnh cũng như là kiểm soát việc truy cập tới thiết bị của người dùng.
Copy from :
http://manthang.wordpress.com/2010/11/27/cau-hinh-file-etc-fstab-de-quan-ly-viec-mount-thiet-bi-trong-linux/


Như chúng ta đều biết (well, với những người biết Linux thôi), nó không dùng khái niệm phân vùng, mà chỉ dùng một thư mục duy nhất (gọi là '/', tớ gọi là slash), từ đó đổ xuống tất cả thư mục ngoài. Nếu bạn chia phân vùng, thì phân vùng đó phải được 'gắn' vào '/' trước khi nó được dùng. Tất cả các ổ đĩa, đĩa ngoài, USB,...cũng như vậy.

Lợi điểm của việc này là đơn giản hóa việc quản lý file và không phải tìm mất công. Nhược điểm của nó là phân loại file không hiệu quả. Để sử dụng một thiết bị gắn ngoài nào trên Linux, bạn gắn nó vào máy, rồi chạy lệnh mount đĩa, bạn sẽ dùng được. Để tháo nó ra, bạn dùng umount. Dĩ nhiên là tất cả phải được gắn vào '/' rồi từ '/' bạn truy cập lên chúng.

  • Lợi điểm của việc này :
  • Linux nhận được hầu hết các thiết bị gắn ngoài dạng này (tức là không cần cài thêm driver).

    Nhược điểm :
  • Người dùng không phân biệt được tên ổ đĩa. Trong Windows việc này đơn giản hóa bằng cách chia 26 chữ cái Latinh, trong Linux chia tên ổ theo dạng XdYZ, tức là sda1, sda2, hda1, sda16, hda4,...tuy tên khó nhớ và khó phân biệt (heyyy~, bạn biết phân biệt giữa ổ HDD và cái USB đang cắm vào trong khi chúng đang cùng tên ?), nhưng đây là lợi điểm vì không có giới hạn về tên (chữ số đâu có giới hạn).

Tóm lại, việc phân biệt nhầm tên ổ đĩa trong Linux hoặc tên thiết bị có thể gây ra các tác hại lớn, chẳng hạn như tạo FS nhầm ổ, v..v...Nhưng vấn đề xác định sẽ được nói trong một TUT khác. Bây giờ chúng ta sẽ nói về cách mount ổ đĩa vào '/' và umount, cũng như thiết đặt tự động mount ổ đĩa trong /etc/fstab.

Mount đĩa
Để mount một đĩa (hay 1 thiết bị nào đó, nhưng không có nghĩa là bạn gắn con chuột USB vào rồi đi mount con chuột nhá  mình tượng trưng ổ đĩa cứng thôi, hoặc là partition cũng được) bạn đánh lệnh
Code:
mount -tùy_chọn thiết_bị thư_mục
Thú vị ở một điểm, Linux đối xử với tất cả thiết bị như là tập tin, chúng nằm trong /dev và liên kết tới thiết bị bạn gắn vào, tức là bạn có thể gắn tập tin trong /dev và từ đó sẽ tiến tới gắn thiết bị thật. Vậy nếu bạn đã biết tên thiết bị (giả sử thôi) là sdb1 thì bạn có thể gắn nó bằng :
Code:
mount -t vfat /dev/sdb1 /home/scifi/drive/sdb1
Trong trường hợp này, tên FS (hệ thống tệp tin) của sdb1 là FAT. Ở đây
Code:
- /dev/sdb1 : Tên thiết bị cần gắn vào.
- /home/scifi/driver/sdb1 : Tên thư mục cần chứa điểm gắn, tức là thư mục gốc của thiết bị gắn vào sẽ nằm trong thư mục này, để từ đó bạn có thể sử dụng thiết bị gắn vào.
Trong trường hợp bạn có chọn nhầm điểm gắn vào thư mục có chứa dữ liệu, thì cũng không sao, thư mục đó cũng không bị xóa, nó chỉ bị ẩn tạm thời (dữ liệu bị ẩn tạm thời). Để xem danh sách các điểm gắn đã gắn, bạn đánh 
Code:
mount -l
kết qủa
Code:
/dev/sda11 on / type ext4 (rw,errors=remount-ro,commit=0) (1)
proc on /proc type proc (rw,noexec,nosuid,nodev) (2)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
gvfs-fuse-daemon on /home/scifi/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=scifi)
/dev/sda3 on /home/scifi/dv type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096,default_permissions) [Data] (3)
Hãy chú ý các dòng (1), (2) và (3) (có in đậm)

(1) : Phân vùng swap được gắn vào '/'.
(2) : /proc FS (như đã nói ở trên, proc không phải ổ đĩa, không nhất thiết) được gắn vào /proc.
(3) : Phân vùng ngoài được gắn vào /home/scifi/dv.

Nói chung (hãy thú thật là nhìn vào nội dung trên bạn sẽ không hiểu ), cấu trúc 1 dòng trong mount -l như sau :
Code:
[Tên thiết bị] on [vùng gắn vào] type [loại] [phân quyền]
Tên thiết bị, vùng gắn vào đã nói ở trên. Còn loại phân vùng thì có thể kể tên một vài loại : ext3,ext3,ext4,vfat,squashfs (không biết gọi thằng này ), ntfs,... còn quyền thì đây là những quyền cơ bản :
QuyềnGiải thích
autoĐể mount tự xác định dạng tập tin hệ thống [FS] của thiết bị gắn vào.
execCho phép thực thi các tệp trên thiết bị gắn.
remountCho phép thực hiện mount lại với tùy chọn khác.
roRead-Only
rwRead+Write
suidCho phép dùng Sticky bit và bit thay đổi người dùng (+s).
userNgười dùng bé hơn Super User hoặc root cũng được quyền gắn. Tuy nhiên tùy vào ý thức của root thì nên đặt thêm cái này đi với ro để tránh người dùng viết lên thiết bị.

Gỡ gắn
Để gỡ gắn, dùng umount. Dạng đơn giản nhất :
Code:
umount thiết_bị
f.e. :
Code:
umount /dev/sda3
Chú ý : Với mount & umount cần thực hiện dưới quyền root hoặc Super User. Đây là một trong những đặc điểm của UNIX nói chung, mọi công việc đều thưc hiện 'qua tay root'.

Chỉnh sửa /etc/fstab

Thực ra bạn cat /etc/mtab cũng y chang như mount -l vì chúng đều có cùng tác dụng : liệt kê các thiết bị đang gắn vào máy tính. Bây giờ giả sử bạn không muốn lúc nào cũng phải bật máy lên rồi gắn ổ đĩa mới dùng được. Bạn muốn gắn trước ? Ok. /etc/fstab là giải pháp. fstab là 1 file text chỉ định các hệ thống cần gắn trước khi chạy kernel.

Luôn luôn backup fstab trước 


Mở /etc/fstab bằng quyền root :
Code:
gksudo gedit /etc/fstab


Đây là fstab trên máy mình :
Code:
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/sda11      /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda12 during installation
UUID=749461d4-94fd-4c61-ae48-4a70022fcab0 none            swap    sw              0       0
Như trên, có thể thấy /proc và phân vùng swap được gắn vào trước. bây giờ ta sẽ gắn phân vùng mà ta muốn gắn.
Trước hết cần phân tích dòng lệnh :
Code:
# : Comment (ghi chú)
Còn dòng bên dưới :
Code:
/dev/sda11      /               ext4    errors=remount-ro 0       1
Có thể giải thích dạng :
Code:
tên-thiết-bị Điểm-gắn Loại-phân-vùng Quyền Dump Pass
Riêng vùng dump và pass thì không cần quan tâm, có thể để 0 cho 2 vùng này. Còn các điểm gắn và tùy chọn ở trên thì đã giải thích ở trên, bạn có thê tự làm. Riêng loại phân vùng thì có thể để auto để tự xác định. Có thể đặt nhiều quyền trên 1 dòng, phân cách bởi dấu phẩy

Ví dụ
Code:
/dev/sda3 /home/scifi/dv auto user,ro,exec,remount 0 0
/dev/sda4 /home/scifi/dx auto user,ro,exec,sync 0 0
Bây giờ reboot lại, nó sẽ tư động gắn phân vùng đã chỉ định trong /etc/fstab. Nếu có sự có bạn có thể 'bay' vào Recovery và sửa lại /etc/fstab cho đúng, nói chung việc thay đổi fstab không ảnh hưởng gì nhiều đến hệ thống .

Bạn có thể dùng mkdir với -p (kết hợp khai triển biểu thức nếu tạo nhiều folder) để tạo các folder riêng để mount.