RaspBerry Pi – Chuyển thư mục dữ liệu MySQL sang USB Flash

☠: Bài viết yêu cầu có kiến thức và chuyên môn đôi chút về Hệ điều hành, Linux, nếu bạn chưa có, vui lòng đọc chơi cho biết, không thắc mắc ?
Để thuận tiện cho việc theo dõi, thu thập thông tin cũng như lưu trữ các nguồn nội dung hay, tôi sử dụng Tiny Tiny RSS là feed reader thay vì sử dụng Feedly, InnoReader …. Tự nhận là một người thích sưu tầm, đặc biệt là dữ liệu cho nên tôi thường có xu hướng tự host, maintain để kiểm soát được nguồn dữ liệu của mình trên máy chủ. Trong thời gian gần đây, do việc cá lạ cắn cáp liên tục dẫn đến việc cáp quang biển quốc tế AAA thường xuyên đứt theo định kì, theo (đôi khi không theo) dự báo của người dân cũng như theo diễn biến tình hình chính trị xã hội tại Đông Lào. ? Cảm thấy bức xúc và đầy quan ngại đối với thú vui xem JAV, diễn biến tình hình chiến sự mồm gần đây trên các kênh thông tin, tôi quyết định lôi con RaspBerry Pi 1 B cũ mèm ngày xưa ra để tự host cho nhanh.

RaspBerry Pi - Chuyển thư mục dữ liệu MySQL sang USB Flash
RaspBerry Pi – Chuyển thư mục dữ liệu MySQL sang USB Flash

Nhắc đến con RaspBerry Pi 1 B này, xin phép được lan man một chút, có lẽ tôi là một trong những người đầu tiên ở xứ thiên đường này sở hữu nó, cái thời góp vốn, chờ hoàn thiện, sau đó thương mại hóa rồi đăng kí, bốc thăm lấy code để được quyền mua cách đây 6 đến 7 năm trước rất khác bây giờ. Giống hầu hết những kẻ được gọi là geek nửa mùa, trước khi mua thì rất nhiều dự định, dự án được chuẩn bị sẵn, nhưng sau 8 tháng chờ đợi, vâng 8 tháng từ lúc trả tiền, được cầm trên tay chiếc máy tính siêu nhỏ đầu tiên, tôi làm một cái video unbox ngon lành, review các kiểu xong gói gém cẩn thận và cất tủ … đến ngày hôm qua thì lôi ra set-up một con local server để xài. ?
Lan man vậy đủ rồi. Một điểm yếu của Raspberry Pi là boot, dữ liệu được ghi / đọc trên thẻ SD / Micro SD (tôi sử dụng thế hệ đầu tiên nên thẻ Micro SD phải có Adapter). Rủi ro mất dữ liệu là rất lớn, chưa kể thẻ nhớ không phải là hàng xịn (ngu gì mua hàng xịn chứ) nên để sử dụng lâu dài cần giảm tải cho nó để đảm bảo thời gian sử dụng lâu nhất có thể cũng như sự toàn vẹn dữ liệu. Sử dụng nguồn 5V cấp ngoài không đủ để cấp nguồn cho ổ cứng di động, qua tìm hiểu và suy luận, giải pháp của tôi là sử dụng 2 usb flash để lưu dữ liệu chính của các app, scripts…. các tác vụ đọc / ghi của hệ thống sẽ giảm tối đa hoặc đưa vào RAM.
Để tránh lan man, ôm đồm nhiều thông tin, nhiều mục như những lần trước đây dẫn đến viết mãi chả xong nên không public được, lần trước kêu quay lại viết bài đều đặn mà đến nay sắp được 1 năm đến nơi rồi vẫn chỉ lèo tèo vài ba bài không chất lượng. Bài viết này tôi sẽ chỉ nói riêng về cách thức tôi chuyển toàn bộ thư mục dữ liệu /var/lib/mysql sang usb flash được cắm cố định với Raspberry Pi. Nhiều bài viết theo từng mục với nhau sẽ được gom lại thành một chủ đề.
Lưu ý: Toàn bộ lệnh, cấu hình, môi trường thực hiện trên Arch Linux, các bản phân phối khác cũng có thể làm tương tự với một số lệnh cài đặt, quản lý khác tùy theo từ distro.

  1. Cài đặt MariaDB: MariaDB có thể cài đặt dễ dàng từ repository với lệnh $ sudo pacman -S mariadb sau đó tiến hành cài đặt như hướng dẫn bằng cách chạy lần lượt # mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql/usr/bin/mysql_secure_installation để đặt mật khẩu cho tài khoản root cũng như xóa bỏ các dữ liệu demo. Dừng daemon MySQL trước khi thực hiện các bước tiếp theo.
  2. USB Flash chứa dữ liệu cần định dạng (format) theo ext4 để đảm bảo tính toàn vẹn của dữ liệu, ngoài ra nó hỗ trợ phân quyền người dùng, nhóm đối với dữ liệu nữa. Bạn có thể gắn (mount) nó thành 1 thư mục để dễ thao tác hơn. Không nên sử dụng định dạng khác chẳng hạn như FAT, NTFS, … do việc gắn, phân quyền khá phức tạp.
  3. Gắn USB Flash vào Raspberry Pi, sử dụng lệnh $ lsblk -f để xem thông tin của nó. Ví dụ của tôi như thế này:
    NAME        FSTYPE LABEL  UUID                                 MOUNTPOINT
    sda                                                            
    `-sda1      ext4   PiData c26b34f5-7520-4ab9-9729-b0b93e50705b /home/narga/PiData
    sdb                                                            
    `-sdb1      ext4          f6fcd81e-806f-4a2b-a2e9-368a58ce1bdc /home/narga/Pi
    mmcblk0                                                        
    |-mmcblk0p1 vfat   boot   CD5D-BE66                            /boot
    `-mmcblk0p2 ext4   root   8aca2a99-4371-4f7c-b4a6-5d98ad2d931c /
    

    Như các bạn thấy, tôi gắn 2 USB Flash và mount chúng thành 2 thư mục riêng biệt trong home. Tôi sẽ chuyển toàn bộ thư mục /var/lib/mysql sang đây.

  4. Chép toàn bộ dữ liệu thư mục /var/lib/mysql sang /new/path/place bằng lệnh # rsync -avzh /var/lib/mysql /path/to/new/place để giữ nguyên phân quyền của các tập tin trong đó. Cấp quyền đọc / ghi / sở hữu cho các tập tin, thư mục ở đường dẫn mới.
  5. Đổi tên # mv /var/lib/mysql /var/lib/mysql.default tạo thư mục mới # mkdir /var/lib/mysql và gán nó vào thư mục chứa dữ liệu mới bằng lệnh # mount --bind /home/narga/Pi/mysql /var/lib/mysql trong trường hợp này, sử dụng ánh xạ bằng lệnh ln -s không sử dụng được, tôi không hiểu tại sao và cũng không muốn mất thời gian tìm hiểu, miễn cách kia được là được ?.
  6. Như bạn thấy, dữ liệu mới giờ nó được chuyển sang một thư mục nằm trong /home/user, đây là vấn đề mà ban đầu tôi mắc phải dẫn đến việc chạy daemon của mysql không được do nó được thiết lập quyền cấm ghi / đọc dữ liệu ngoài /var/lib/mysql. Điuề này được giải thích ở đây. Vậy chúng ta cần điều chỉnh lại một chút để cho phép daemon của MySQL đọc / ghi dữ liệu ở /home/user. Sửa trực tập tin cấu hình dịch vụ systemd của MySQL /usr/lib/systemd/system/mariadb.service.
    Tìm đến dòng có ProtectHome=truePrivateDevices=true sau đó sửa tham số thành false. Đừng quên thông báo các thay đổi này tới hệ thống bằng lệnh # systemctl daemon-reload.

Như vậy đến đây là xong, bạn bắt đầu dịch vụ của MySQL bằng lệnh # systemclt start mysqld và sử dụng như bình thường.
☠: Có một số lưu ý nho nhỏ sẽ cập nhật sau.

2018.06.29 – Giảm tải cho hệ thống bằng cách tắt logs và kết nối từ host khác

Đối với người dùng cá nhân và không có nhu cầu, đây là 2 tính năng có thể nói là vô dụng, tăng tải hệ thống, nên tắt đi nhất là đối với hệ thống yếu như con Raspberry Pi này. Bằng cách thêm các dòng lệnh sau vào /etc/mysql/my.cnf

skip-networking
#log-bin=mysql-bin
#binlog_format=mixed

hoặc có thể giới hạn kích thước cũng như thời gian của logs

expire_logs_days = 10
max_binlog_size  = 100M

Đừng quyên khởi động lại dịch vụ mysqld nhé.

2018.07.03 – Tự động mount –bind thư mục /var/lib/mysql trong fstab

Với lệnh # mount --bind khi khởi động lại hệ thống thì thư mục chỉ định sẽ không được gán nữa, cần phải lặp lại câu lệnh ở trên. Để tự động quá trình này khi khởi động, ta thêm dòng sau vào /etc/fstab

/home/narga/Pi/mysql /var/lib/mysql  none defaults,bind 0 0