Hexa's Blog

HTTPS và các khái niệm liên quan

13/01/2021 SSL

I. Từ vựng

  • Certificate Authority (CA): Cơ quan có thẩm quyền để xác nhận SSL
  • Certificate signing request (CSR): Yêu cầu chứng nhận chứng chỉ SSL
  • Certificate: Chứng chỉ

II. Các file liên quan trong việc cài đặt HTTPS

  • Private key file: Như tên gọi nó chính là private key
  • Certificate signing request(csr): File này được tạo ra sau khi có private key. Khi tạo yêu cầu chứng nhận chứng chỉ, sẽ cần phải cung cấp thêm các thông tin như tên quốc gia, email, và nhiều hơn nữa. Những thông tin được dùng để xác nhận và tạo ra certificate (chứng chỉ), đơn vị tạo ra chứng chỉ được gọi là Certificate Authority. Tuy nhiên cũng có thể tự tạo ra chứng chỉ từ yêu cầu chứng nhận chứng chỉ, vì người chứng nhận không phải là Certificate Authority nên là trên web browser, trình duyệt sẽ hiển thị màu đỏ bên cạnh đường link.
  • Certificate(chứng chỉ)

Theo như các khái niệm trên thì khi cài đặt HTTPS cho server, chỉ cần private keycertificate. Nếu private key đã được mã hóa thì lúc cài đặt cho server phải nhớ thêm mật khẩu để server có thể giải mã.

III. Các bước liên quan

1a. Lệnh để tạo private key đã mã hóa

openssl genrsa -des3 -out domain.key 2048

Lưu ý rằng file domain.key đã được mã hóa. Để sử dụng cho server, cần được giải mã.

-des3: mã hóa private key theo thuật toán `DES` 3 lần.
2048: độ dài của private key

1b. Lệnh tạo private key không được mã hóa

openssl genrsa -out private.key 2048

2. Lệnh để tạo yêu cầu chứng nhận chứng chỉ(csr) từ private key

openssl req -key domain.key -new -out domain.csr

3. Lệnh để tự tạo certificate từ yêu cầu chứng nhận chứng chỉprivate key

openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt

4. Lệnh giải mã private key

openssl rsa -in encrypted.key -out decrypted.key

IV. Lưu ý

Không khuyên khích việc xem manual của openssl rồi tự làm, document của command openssl rất khó hiểu và chỉ mang tính chất tham khảo, đôi khi tự xem rồi không biết thứ tự đâu mà làm. Ví dụ như lệnh tạo certificate từ private keycsr, xem manual mà ko hiểu nên sắp xếp argument như thế nào cho thích hợp. Tốt nhất là làm theo hướng dẫn.

Postgresql - Thiết lập hot-standby

04/11/2020

I. Khái niệm

Trước khi đọc sâu hơn về cách thiết lập replication này, tôi sẽ giải thích về mô hình hot-standby. Ở mô hình này, máy standby sẽ có khả năng bị read (đọc), khi máy primary xảy ra vấn đề, máy standby sẽ được tăng cấp thành primary mới, cho phép nó có khả năng read/write (đọc/ ghi).

Khi áp dụng kỹ thuật này, có thể sử dụng thêm database proxy để giảm áp lực read cho máy primary.

Nói về dữ liệu, 99.999999999% là dữ liệu trên máy standby sẽ giống với máy primary. Lý do mà nó không đạt được đến mức 100% là do khi máy primary chết, máy primary không gửi write-ahead-log cho máy standby được, việc này dẫn đến hệ quả là máy standby không có dữ liệu.

Ở bài viết này, sẽ tập trung nói đến việc làm sao để thiết lập hot-standby replication cũng như cách kích hoạt thủ công hot-standby server để nó trở thành primary server mới. Vấn đề phục hồi primary cũ sẽ được nói ở bài viết tiếp theo.

[1] Mô hình hot-standby replication
[1] Mô hình hot-standby replication

II. Thiết lập

1. Cài đặt Postgresql (2020-11-04 tested)

Ở bài hướng dẫn này, tôi sử dụng server là Fedora. Hướng dẫn trên mạng rất nhiều để tiện theo dõi trên bài viết tôi sẽ viết lại ở đây.

Bạn vào website: https://www.postgresql.org/download/linux/redhat/, trong phần chỉ mục PostgreSQL Yum Repository, hãy điền hết cái form, sau khi điền xong một đoạn script cài đặt sẽ hiện ra, bạn chỉ việc copy-paste vào terminal là chạy. Việc cài đặt này là tiêu chuẩn và áp dụng trên cả máy primarystandby.

Ví dụ như tôi đang sử dụng fedora 32 x64, muốn xài postgresql-11, sau khi điền xong form, tôi sẽ nhận được đoan script sau:

# Install the repository RPM:
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/F-32-x86_64/pgdg-fedora-repo-latest.noarch.rpm

# Install PostgreSQL:
sudo dnf install -y postgresql12-server

# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

2. Thiết lập máy primary

a. Tạo user

Bạn sẽ cần phải tạo 2 users

user/password role
repuser/repuser replication
admin/admin superuser

Để thiết lập relication, thực sự chỉ cần đến user với role là replication mà thôi. Tôi chủ động tạo thêm một superuser mới có tên là admin.

Vào terminal, và chạy lệnh sau:

# Chuyển qua user postgresql trên hệ điều hành
sudo su postgres;
# Tao user repuser/repuser
createuser --no-login --pwprompt --replication repuser;
# Tạo user admin/admin
createuser --pwprompt --superuser admin;

b. Thay đổi pg_hba.conf để cấp quyền truy cập

host    all             admin           0.0.0.0/0                         md5
host    replication     repuser         {standy_server_ip}/{mask}         md5
[2] pg_hba.conf
[2] pg_hba.conf

Ở trên hình thì IP/MASK của máy standby là 192.168.2.43/24.

c. Thay đổi postgresql.conf

listen_addresses = '*'
wal_level = replica
archive_command = 'test ! -f /var/lib/pgsql/11/data/archivedir/%f && cp %p /var/lib/pgsql/11/data/archivedir/%f'
max_wal_senders = 3
wal_log_hints = on

Lưu ý archive_command, /var/lib/pgsql/11/data/archivedir/ là thư mục cần phải tạo thêm, nếu chưa có hãy tạo nó sử dụng lệnh sau:

mkdir -p /var/lib/pgsql/11/data/archivedir/
Thiết Lập Ý Nghĩa
listen_addresses Liệt kê IP được phép truy cập vào database server bằng postgresql client
wal_level Mức độ chi tiết của wal, để dữ liệu trong file wal đủ chi tiết để phục hồi, giá trị cần là replica
archive_command command sử dụng để lưu trữ write-ahead-log vào thư mục archive. Ở thiết lập phía trên, nó đầu tiên kiểm tra xem trong thư mục archive có tồn tại file chưa, nếu chưa nó sẽ copy file write-ahead-log vào thư mục archive.
max_wal_senders Số lượng tối đa wal_senders chạy đồng thời với nhau. Nói một cách khác nó chỉ thị số lượng tối đa các kết nối từ standby server đến primary
wal_log_hints Config này quan trong trong việc đồng bộ hóa server primary cũ với primary mới.

Kể từ bước này trở đi, máy primary đã có thể khởi động postgresql server.

systemctl start postgresql-11;

3. Thiết lập máy standby

Trước khi chạy các bước tiếp theo, bắt buộc phải tắt postgresql. Đây là bắt buộc

systemctl stop posgresql-11;

a. Kéo thư mục data từ máy primary sang standby

  • Di chuyển thư mục data cũ đến nơi khác.
    mv /var/lib/pgsql/11/data /var/lib/pgsql/11/data_bak;
    
  • Sử dụng pg_basebackup để kéo thư mục data từ máy primary đến máy standby
    pg_basebackup --pgdata /var/lib/pgsql/11/data -h 192.168.2.68 -p 5432 -U repuser \
                  --password --verbose --progress --write-recovery-conf \
                  --wal-method stream
    

Sau khi chạy xong, bạn sẽ thấy màn hình tương tự như sau.

[3] pg_basebackup
[3] pg_basebackup

Thêm vào đó, trong thư mục data sẽ có thêm 2 file

  • postgresql.auto.conf
  • recovery.conf

b. Thiết lập file recovery.conf

File recovery.conf được tạo ra từ lệnh pg_basebackup với flag --write-recovery-conf. Nội dung của nó đề cập đến chế độ hiện tại của standby server và vị trị của primary server.

    # Nội dung file recovery.conf
    standby_mode = 'on'
    primary_conninfo = 'user=repuser password=repuser host=192.168.2.68 port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any'

Trong file recovery.conf, có thể thấy rõ ràng thông tin truy cập vào primary server

c. Thiết lập posgresql.conf

hot_standby = on

Kể từ bước này trở đi, khởi chạy postgresql server trên standby server.

systemctl start postgresql-11;

4. Kích hoạt Standby server thành Primary server

Không chạy lệnh sau bây giờ, chỉ chạy nó khi bạn biết rằng primary server đã chết.

Để chuyển chế độ của standby server từ standby thành primary, bạn phải chạy lệnh sau trên standby server.

/usr/pgsql-11/bin/pg_ctl promote --pgdata /var/lib/pgsql/11/data;

III. Kiểm tra

1. Kiểm tra xem có những standby server nào đang kết nối.

Vào primary server và chạy sql sau:

select * from pg_stat_replication;

Đây là kết quả nên nhận được, bạn sẽ thấy rõ ràng IP của standby server

    Name            |Value              |
    ----------------|-------------------|
    pid             |1670               |
    usesysid        |16384              |
    usename         |repuser            |
    application_name|walreceiver        |
    client_addr     |192.168.2.43       |
    client_hostname |                   |
    client_port     |51962              |
    backend_start   |2020-11-04 15:57:03|
    backend_xmin    |                   |
    state           |streaming          |
    sent_lsn        |0/F02F468          |
    write_lsn       |0/F02F468          |
    flush_lsn       |0/F02F468          |
    replay_lsn      |0/F02F468          |
    write_lag       |                   |
    flush_lag       |                   |
    replay_lag      |                   |
    sync_priority   |0                  |
    sync_state      |async              |

2. Tạo/Xóa Bảng

Tôi sẽ sử dụng dbeaver để tạo bảng, thêm record, xóa record trên primary server. Tôi kì vọng là sau khi làm những thao tác trên, dữ liệu trên standby server phải giống với dữ liệu trên primary server.

Tôi chạy sql tạo bảng people trên máy primary.

    CREATE TABLE public.people (
            id serial NOT NULL,
            "name" varchar NULL,
            CONSTRAINT people_pk PRIMARY KEY (id)
    );
[4] primary server, tạo bảng people
[4] primary server, tạo bảng people
[5] standby server, xuất hiện bảng people
[5] standby server, xuất hiện bảng people

3. Thêm/xóa record

Để thêm record cho bảng people, tôi chạy câu sql sau:

    insert into people (name) values ('Linh'), ('Son'), ('Long'), ('TTEK');

Để xóa record cho bảng people, tôi chạy câu sql sau:

    delete from people where name = 'TTEK';

Khi kiểm tra dữ liệu trên máy primary và máy standby dữ liệu là giống hệt nhau.

IV. Câu kết

Vậy là việc thiết lập hot standby server đã hoàn tất. Ở bài viết tiếp theo, tôi sẽ nói về tình huống server primary chết, server standby chiếm quyền và đóng vai trò là server primary mới. Vấn đề xảy ra khi chúng ta muốn khởi động lại server primary cũ, và muốn lấy toàn bộ dữ liệu mới đc thay đổi trên máy primary mới và thiết lập máy primary cũ trở thành máy standby mới.

Quản lý version của ngôn ngữ theo dự án với ASDF

29/10/2020 Linux

Trong quá trình phát triển phần mềm, khả năng rất cao là mỗi dự án chúng ta sẽ cần đến một ngôn ngữ lập trình khác nhau, thêm vào mặc dù là chung ngôn ngữ nhưng phiên bản của ngôn ngữ lập trình thay đổi theo dự án. Việc quản trị ngôn ngữ lập trình và phiên bản của nó là cực kì quan trọng.

Phần mềm mà tôi thích sử dụng đó là asdf https://asdf-vm.com/ . Cách cài đặt thì có thể tìm thấy trực tiếp trên trang chủ của asdf. Bài viết này sẽ nói về những tính năng hay ho mà asdf tôi sử dụng hàng ngày.

Cơ chế hoạt động của asdf là tạo ra một lớp bọc phía bên ngoài cho các executable file , ứng với mỗi phiên bản, asdf sẽ chọn lựa và chạy file tương ứng. Việc quản lý version được làm tự động, lập trình viên chỉ việc config.

1. Cài đặt ngôn ngữ lập trình

ASDF cài đặt nhiều ngôn ngữ lập trình cũng như phiên bản của ngôn ngữ đó giúp bạn, cú pháp đơn giản, không cần config nhiều. Cần lưu ý là bạn phải cài plugin trước, Danh sách plugin có thể tìm ở đây https://asdf-vm.com/#/plugins-all.

Ví dụ như muốn cài elixir, thì bạn sẽ cần elixir-plugin.

  • Để cài đặt plugin, bạn sử dụng lệnh sau, trong đó elixir là tên plugin.
asdf plugin-add elixir
  • Để cài đặt ngôn ngữ, chạy lệnh sau, trong đó 1.9.1 là version.
asdf install elixir 1.9.1
[1] elixir 1.9.1
[1] elixir 1.9.1

2. Sử dụng bộ ngôn ngữ lập trình

Một dự án sẽ sử dụng rất nhiều ngôn ngữ lập trình, ví dụ như elixir cho backend, nodejs cho frontend, thêm vào đó trong trường hợp tôi dùng elixir tôi cần quan tâm đến cả erlang nữa. asdf sẽ giúp lập trình viên nhanh chóng chuyển phiên bản của ngôn ngữ lập trình theo dự án.

Ví dụ dưới đây là project_1project_2, hai dự án này nằm ở hai thư mục khác nhau. cả hai có điểm chung là đều sử dụng elixir tuy nhiên nhu cầu về phiên bản lại khác nhau, một cái là 1.9.1 , cái còn lại là 1.9.2

[2] project_1, elixir 1.9.1
[2] project_1, elixir 1.9.1
[3] project_2, elixir 1.9.2
[3] project_2, elixir 1.9.2

Tính năng này được để cập rất chi tiết tại đây https://asdf-vm.com/#/core-configuration.

Để làm được điều này, nói ngắn gọn bạn sẽ cần tạo file .tool-versions ở mỗi project. Trong file này sẽ liệt kê chi tiết version của language. Như trên hình, khi kiểm tra phiên bản của elixir, phiên bản đã hiển thị khác nhau.

File: project_1/.tool_versions

elixir 1.9.1
erlang 22.1
nodejs 10.16.3

File: project_2/.tool_versions

nodejs 13.0.1
erlang 22.1
elixir 1.9.2

How to create an application shortcut on Fedora?

12/10/2020 Linux

Inside $HOME, there is a directory named ~/.local/share/applications which containts all application shortcuts for the current user. To make a new application shortcut you need to make a new file named *.desktop with the following schema.

[Desktop Entry]
Type=Application
Name=Postman
Comment=Postman
Icon=/home/nguyenvinhlinh/Software/Postman-7.0.9/icon.png
Path=/home/nguyenvinhlinh/Software/Postman-7.0.9
Exec=/home/nguyenvinhlinh/Software/Postman-7.0.9/Postman
Terminal=false
Categories=Development;

If it all works correctly, a new application shortcut will be displayed on Gnome Search.

[1] GNOME Search
[1] GNOME Search

How to verify Hostinger domains for ZeroSSL certificate using DNS(CNAME)?

10/10/2020 SSL

ZeroSSL is a free ssl certificate provider. I had follow all the instructions on their official website to configure my hostinger domain, but it’s not enough. At the domain verification step, it declared that Invalid CAA Records eventhough my CNAME record was configured correctly. Seemingly, Hostinger CCA’s default value is missing something.

[1] Invalid CCA Record
[1] Invalid CCA Record

The solution is that you need to check the CCA section belonging to DNS Zone. It’s a must to have following yellow records in your CAA list.

[2] CCA List
[2] CCA List

If you dont have those records, you need to add it manually one by one. Although, you submit new CAA records, it could take up to 30 minutes for verification.

|------+---------------------------+-------|
| name | content                   |   TTL |
|------+---------------------------+-------|
| @    | 0 issue "sectigo.com"     | 14400 |
| @    | 0 issuewild "sectigo.com" | 14400 |
|------+---------------------------+-------|

Reference: https://help.zerossl.com/hc/en-us/articles/360015629499-Verification-error-Invalid-CAA-Records

Đối mặt với SELinux

10/10/2020 Linux

SELinux một thứ rất đang để học hỏi, nhưng lại khó để thực hành. Đặc biệt là các vấn đề liên quan đến SELinux lại là thứ không phải là thứ xảy ra hàng ngày, hàng giờ. Chỉ là thi thoảng, khi triển khai máy chủ mới gặp vấn đề, lúc gặp tôi thường là có hai phương án tùy vào tình huống mà:

  • Tắt luôn SELinux
  • Đọc, hiểu lý do, viết policy và cài đặt policy cho SELinux.

Cứ mỗi lần triển khải server mới, dính vào nginx, reverse proxy là tôi lại phải nhờ anh google. Lần này tôi quyết định viết lại blog, cũng như là một cách để nhắc nhở mình cần phải làm gì khi gặp chuyện với SELinux.

I. Xác định xem có phải vấn đề thuộc về SELinux hay không

Cách dễ nhất để biết được nguyên nhân gặp phải thuộc về SELinux đó là chuyển chế độ của SELinux từ Enforce thành Permission. Đây là các lệnh liên quan

  • getenforce: xem trạng thái của SELinux. Enforce có nghĩa là chặn sạch, block sạch nếu ứng dụng không thỏa mãn luật lệ. Permissive có nghĩa là thông qua, tuy nhiên vẫn sẽ bị log ghi lại.
  • setenforce: cài đặt trạng thái của SELiux. setenforce 1, chuyển sang chế độ Enforce. setenforce 0 là chuyển sang chế độ Permissive.

Nếu mà chuyển sang chế độ Permissive mà phần mêm chạy ổn áp đúng như mong muốn thì biết lý do là SELinux rồi đấy. Bên cạnh đó, hay chú ý đến cả file log của phần mềm, cuộc đời biết đâu bất ngờ.

II. Xem và hiểu file audit.log

File /var/log/audit/audit.log này cực kì quan trọng chứa thông tin liên quan đến lý do tại sao SELinux lại ngăn chặn phần mềm làm điều này, điều kia. Tuy nhiên khi đọc bằng mắt thường sẽ rất khó hiểu. Để đọc và hiểu lý do dễ dàng, nên sử dụng lệnh audit2why.

Ví dụ như sau, tôi cat file log, tôi grep các dòng có từ khóa “denied”, tôi tiếp tục sử dụng audit2why để đọc dễ hiểu hơn.

cat  /var/log/audit/audit.log | grep denied | audit2why

Chắc chắn là khi chạy xong, thông tin sẽ tường mình hơn rất nhiều.

III. Tạo và cài đặt luật lệ để SELinux thông qua

SELinux rất hay ở chỗ nó block phần mêm những nó cũng chỉ rõ ra rằng chúng ta phải làm gì để khắc phục. Đây là một cái rất rất thú vị. Sau khi đã đọc và hiểu tại sao SELinux block, giờ là lúc bổ sung luật lệ cho SELinux. audit2allow là câu lệnh chúng ta cần.

cat  /var/log/audit/audit.log | grep denied | audit2allow -a -M my_module

Câu lệnh trên sẽ tạo ra file my_module.pp. Sử dụng lệnh sau để cài đặt module này vào SELinux.

semodule -i my_module.pp

Sau khi kiểm tra cẩn thận, hay nhớ bật chế độ Enforcing cho SELinux.

LVM, Gia tăng logical volume!

10/05/2020 Linux

I. Giới thiệu

[1] Các lớp trừa tượng - LVM

Đây là câu chuyện tôi đã trải qua khi phải bắt buộc gia tăng logical volume hệ thống. Trong quá trình phát triển, không gian dữ liệu hệ điều hành chiếm dụng bắt đầu nhiều hơn và nhiều hơn. Đã có những lúc tôi nghịch ngợm với VM, Docker, Backup file quá nhiều, kết cục là ổ cứng 500 GB của tôi dần dần cạn kiệt.

Công ty tôi còn một vài cái ổ cứng 500 GB khác. Tôi quyết định mở rộng logical volume lên thêm nữa sử dụng lợi thế của Logical Volume Manager. Với cách tiếp cận này, việc gia tăng logical volume trở nên đơn giản hơn, với khả năng mở rộng lớn, thực sự là chỉ bị hạn chế bởi số cổng SATA hỗ trợ trên bo mạch chủ.

Vì lý do công nghệ này sử dụng nhiều lớp trừu tượng trung gian. Để giúp các bạn hiểu tôi đang nói về lớp nào tôi sẽ thêm các chú thích về tầng trừu tượng [LEVEL X]. Hình số [1] có chú thích chi tiết từng tầng một.

II. Cách làm

Đây là danh sách những việc phải làm khi muốn mở rộng logical volume [LEVEL 5]. Trường hợp của tôi khá là kẹt khi mà Physical Volume Group hoàn toàn ko còn dung lượng dư. Chính vì như vậy, tôi phải gắn thêm một ổ đĩa cứng mới [LEVEL 1].

  • Gắn ổ cứng mới [LEVEL 1]
  • Tạo phân vùng (partition) với định dạng Linux LVM [LEVEL 2]
  • Tạo physical volume từ phân vùng vừa tạo [LEVEL 3]
  • Thêm physical volume vừa tạo vào volume group [LEVEL 4]
  • Thêm dung lượng cho logical volume từ dung lượng trống từ volume group [LEVEL 5]
  • Cập nhập filesystem

1. Gắn ổ cứng mới

Nghe dễ thật, nhưng tôi lại gặp một vấn đề khác.

- Cắm ổ cứng mới vào bo mạch chủ
- Bật máy tính
---> Hệ điều hành không boot lên được
- Không cắm ổ cứng mới vào bo mạch chủ vội
- Bật máy tính, vào hệ điều hành
- Bây giờ mới cắm ổ cứng vào bo mạch chủ
---> Hệ điều hành không nhận được ổ đĩa mới  (kiểm tra với lệnh `lsblk`, hoặc phần mềm `gnome-disk`)

Để hệ điều hành nhận ổ cứng mới, tôi đã phải làm theo các bước sau.

- Format toàn bộ dữ liệu của ổ cứng mới (Nó đã được sử dụng và có hệ điều hành cũ trên đó)
- Cắm ổ cứng mới vào bo mạch chủ
- Bật hệ điều hành.
---> Hệ điều hành khởi động thành công, sau khi đăng nhập nó đã nhận được ổ đĩa mới.
Như trên hình, `sdb` là ổ đĩa mới.

2. Tạo phân vùng loại Linux LVM từ ổ đĩa [LEVEL 2]

Cách làm mà tôi sử dụng là phần mềm fdisk. Đây là các chỉ mục quan trọng

  • Tạo GPG partition table
  • Tạo phân vùng mới với loại Linux LVM

a. Tạo GPG partition table Sử dụng lệnh sau với quyền root.

fdisk /dev/sdb

sdb là tên của ổ đĩa. Lưu ý là sdb chứ không phải là sdb1, hoàn toàn không có hậu tố đằng sau. Số 1 ở đây ám chỉ phân vùng chứ không phải là ổ đĩa. Nếu bạn đang gắn ổ cứng thứ 3, ổ cứng của bạn khả năng rất cao sẽ tên là sdc.

Fdisk là phần mềm có nhiều tính năng chết người, Thao tác của phần mềm khá đơn giản, chọn chỉ mục bằng phím, kết thúc bằng enter. Ví dụ để xem hướng dẫn của phần mềm, ấn phím m và kết thúc bằng enter.

Để tạo GPG partition table, hãy chọn chỉ mục có tên là create a new empty GPT partition table.

[2] Tạo GPT Partition table

b. Tạo phân vùng Linux LVM

Chọn chỉ mục có tên là add a new partition

[3] Tạo phân vùng mới

Tiếp theo, tôi sẽ bị yêu cầu nhập

  • partition number: mặc định
  • first sector: mặc định
  • last sector: mặc định
    Command (m for help): n
    Partition number (1-128, default 1): 1
    First sector (2048-4194270, default 2048): 2048
    Last sector, +sectors or +size{K,M,G,T,P} (2048-4194270, default 4194270): 4194270

    Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.

Tôi đã tạo xong phân vùng mới, tuy nhiên định dạng của nó là Linux filesystem, Cái tôi muốn là Linux LVM. Chọn chỉ mục có tên là change a partion type

[4] Đổi loại phân vùng

Phần mềm sẽ chọn phân vùng duy nhất trong trường hợp này là 1. Trong phần chọn loại phân vùng, Linux LVM có mã số là 31.

[4a] Đổi loại phân vùng

Kiểm tra lại với chỉ mục có tên print the partition table. Nó nên có phân vùng mới kèm theo là loại phân vùng có tên Linux LVM.

Kết thúc giai đoạn này với chỉ mục mang tên write table to disk and exit

[5] Lưu lại thiết lập

3. Tạo phsyical volume [LEVEL 3]

Tạo physical volume với lệnh sau:

pvcreate /dev/sdb1;

Kiểm tra xem physical volume đã tạo thành công từ /dev/sdb1 với lệnh sau:

pvs;

4. Gán physical volume vào volume group [LEVEL 4]

Tôi cần phải biết xem logical volume mà tôi cần gia tăng thuộc volume group nào. Sử dụng lệnh sau để xem danh sách logical volume hiện đang có cũng như là volume group mà nó thuộc về.

lvs;

Trong trường hợp của tôi. logical volume mà tôi muốn gia tăng dung lượng là homeroot. Cả hai logical volume này thuộc volume group có tên là fedora

Đây là lệnh để tìm xem thông tin của toàn bộ volume group. Hãy chú ý cột VFree, sau khi thêm physical volume vào volume group. giá trị của cột VFree phải tăng lên, tạo tiền đề để gia tăng các logical volume ở bước tiếp theo.

vgs;

Đây là lệnh để gán physical volume /dev/sdb1 vào volume group có tên là fedora.

vgextend fedora /dev/sdc1;

5. Gia tăng dung lượng cho logical volume [LEVEL 5]

Đây là cả chỉ mục cần quan tâm:

  • Sử dụng lệnh lvextend để gia tăng logical volume
  • Sử dụng lệnh resize2fs để cập nhật file system

Tôi cần gia tăng logical volume có tên là roothome. Cụ thể là tôi muốn tăng 400 GB cho home và 100% phần còn dư cho root. Đây là cách làm.

lvextend fedora/home --size +400GB;
lvextend fedora/root --extents +100%FREE;

Để kiểm tra, hãy sử dụng lệnh sau: lvs. Tuy nhiên filesystem thì hoàn toàn chưa được cập nhật, hãy sử dụng lệnh sau để thấy sự khác biệt df -h, chú ý cột Filesystem, Size và cột Mount on

df -h;

Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G  245M  7.6G   4% /dev/shm
tmpfs                    7.8G   50M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/fedora-root  116G  111G    0G 100% /
tmpfs                    7.8G   52K  7.8G   1% /tmp
/dev/sda1                976M  255M  655M  28% /boot
/dev/mapper/fedora-home  258G  258G    0G 100% /home

Trong trường hợp của tôi, hai filesystem mà tôi cần quan tâm là:

/dev/mapper/fedora-root
/dev/mapper/fedora-home

Để cập nhập filesystem sử dụng lệnh resize2fs

resize2fs /dev/mapper/fedora-root;
resize2fs /dev/mapper/fedora-home;

Bước cuối cùng, kiểm tra lại thông tin filesystem với df -h:

df -h;

Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G  245M  7.6G   4% /dev/shm
tmpfs                    7.8G   50M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/fedora-root  211G  111G  100G  52% /
tmpfs                    7.8G   52K  7.8G   1% /tmp
/dev/sda1                976M  255M  655M  28% /boot
/dev/mapper/fedora-home  658G  258G  400G  39% /home

Phù phù phù, đã xong rồi đó.

Phân Vùng LVM - Ý Nghĩa và Phát Triển

09/05/2020 Linux

I. Logical Volume Manager (LVM)

LVM - Phần mềm quản lý nhiều ổ cứng Logical Volume, tác dụng của LVM đó là cho phép ghép nhiều ổ đĩa cứng với nhau, sau đó tạo ra một lớp trừu tượng trước hệ điều hành. Với lợi thế này, việc gia tăng dung lượng cho hệ điều hành dễ dàng hơn bao giờ hết. Hệ điều hành có thể đang chạy trên hai ổ cứng vẫn đảm bảo được sự trơn tru, đơn giản khi vận hành như đang làm việc với một ổ cứng mà thôi.

Hệ thống từ vựng được sử dụng khi nói đến LVM hơi nhầm lẫn khi dịch qua tiếng Việt

  • volume: Là một từ trừu tượng, có thể hiểu khi là một cục nào đó chứa dữ liệu
  • partition: Phân vùng, khi nói đến phân vùng, chúng ta nói đến việc chia ổ cứng thành nhiều phần vùng
  • physical volume: Khi nói đến LVM, thì physical volume là thứ được tạo ra từ partition
  • physical volume group: Là nhóm được tạo ra từ nhiều partition
  • logical volume: Khi nói đến LVM, thì logical volume là volume được tạo ra từ physical volume group

Hiểu nôm na thì ta sẽ có sơ đồ từ vựng thứ tự của các định nghĩa như sau:

Ổ Đĩa (LEVEL 1) → Partition (LEVEL 2) → Physical Volume (LEVEL 3) → Physical Volume Group (LEVEL 4) → Logical Volume (LEVEL 5)
[1] Các Mức độ trìu tượng của LVM
[1] Các Mức độ trìu tượng của LVM

II. Các quy trình thường gặp khi làm việc với LVM

a. Tạo logical volume

  • Tạo phân vùng (partition) có định dạng là Linux LVM từ ổ cứng vật lý. [LEVEL 2]
    • Sử dụng lệnh fdisk
  • Tạo physical volume từ phân vùng (partition) vừa tạo [LEVEL 3]
    • Sử dụng lệnh pvcreate
  • Tạo physical volume group với physical volume vừa tạo [LEVEL 4]
    • Sử dụng lệnh vgcreate
  • Tạo logical volume từ physical volume group [LEVEL 5]
    • Sử dụng lệnh lvcreate

b. Gia tăng dung lượng cho logical volume

  • Xác định xem physical volume group cái tạo ra logical volume cần tăng dung lượng xem là nó có còn dung lượng trống hay không. [LEVEL 4]
    • Sử dụng lệnh vgs, vgdisplay
  • Nếu còn dung lương trống thì thêm dung lượng vào logical volume [LEVEL 5]
    • Sử dụng lệnh lvextend, resize2fs
  • Nếu không còn thì phải thêm physical volume vào physical volume group [LEVEL 3]
    • Sử dụng lệnh vgextend
  • Sau đó thì gõ lệnh thêm dung lượng vào logical volume [LEVEL 5]
    • Sử dụng lệnh lvextend, resize2fs

c. Giảm dung lượng của logical volume

Cực kì nguy hiểm!

Hãy backup trước khi làm việc này. Là người viết, tôi chưa bao giờ thử cái tính năng này. Viết cho nó có chữ thôi chứ, dùng cái tính năng của khỉ này, tôi không dám.

[2] Chắc là không sao đâu!
[2] Chắc là không sao đâu!
  • Xác định xem logical volume, bao nhiêu dung lượng đã được sử dụng, dung lượng còn lại có thể giảm được hay không. [LEVEL 5]
    • Sử dụng lệnh df -h, nó sẽ hiển thị dung lượng sử dụng.
  • Gõ lệnh để giảm dung lượng của logical volume, dung lượng được giảm sẽ về logical volume group [LEVEL 5]
    • Sử dụng lệnh lvreduce, resize2fs

III. Các câu lệnh liên quan

Command Level Ý nghĩa
lsblk Level 1, Level 2 Liệt kê danh sách các ổ cứng - hay còn gọi là block devices. Ví dụ như sda, sdb, sdc
fdisk Level 1, Level 2 Thao tác với ổ cứng ví dụ như tạo phân vùng (partition) trên ổ cứng
pvcreate Level 3 Tạo physical volume từ phân vùng(partition) trên ổ cứng
pvremove Level 3 Xóa physical volume
vgcreate Level 4 Tạo physical volume group từ một hay nhiều physical volume
vgextend Level 3, Level 4 Thêm physical volume vào physical volume group
vgreduce Level 3, Level 4 Loại bỏ physical volume khỏi physical volume group
vgremove Level 4 Xóa logical volume group
vgs, vgdisplay Level 4 Liệt kê các physical volume group đang có
lvcreate Level 5 Tạo logical volume từ physical volume group
lvs, lvdisplay Level 5 Liệt kê các logical volume đang có
lvextend Level 5 Gia tăng dung lượng cho logical volume
lvreduce Level 5 Giảm dung lượng cho logical volume
lvremove Level 5 Xóa logical volume
resize2fs Level 5 Khi thao tác gia tăng logical volume, lệnh resize2fs được sử dụng để cập nhât filesystem cho logical volume
mkfs   Định dạng cho logical volume ví dụ như là ext2, ext3, ext4 , ntfs.
Make File System

IV. Hứa hẹn

Tôi đã gặp tình huống như sau. Tôi có một Đĩa Vật Lý 500GB. Trên ổ đĩa này cài Hệ Điều Hành. Vấn đề đặt ra là làm sao để tôi có thể lắp thêm ổ cứng vật lý mới, tiếp tục sử dụng hệ điều hành bình thường và quan trọng nhất là phải sử dụng lợi thế của Logical Volume Manager.

Trong bài viết tiếp theo, tôi sẽ kể chuyện tôi đã làm như thế nào. Thực tế thì tôi đã cóng tay đến mức phải chạy nháp trên máy ảo trước khi làm thật. Có những chuyện lúc dùng VM không xảy ra, mà đến khi chạy thật mới gặp phải.

Tuy nhiên, sau tất cả thì đến bây giờ mọi thứ vẫn ổn. Tôi khá là tự tin vào cách làm này.

Mã hóa và giải mã file trên linux sử dụng GPG

09/05/2020 Linux

Bài viết này đưa ra cách nhanh nhất để mã hóa cũng như giải mã file trên linux. Việc mã hóa và giải mã sẽ sử dụng mật mã (symmetric-key - key đổi xứng)

I. Mã hóa file

gpg --symmetric tesla.org

Lệnh này sẽ mã hỏi bạn mật mã, hay ghi nhớ mật mã này. Sau khi quá trình mã hóa kết thúc, một file có tên là tesla.org.gpg sẽ xuất hiện. Đây chính là file đã được mã hóa.

II. Giải mã file

gpg tesla.org.gpg

Phần mềm sẽ yêu cầu mật mã. Sau khi quá trình giải mã kết thúc, một file có tên là tesla.org sẽ xuất hiện.

III. Lưu ý.

Nếu mà bạn mã hóa, rồi giải mã ngay lập tức. Khả năng rất cao là khi giải mã phần mềm sẽ không yêu cầu nhập mã. Để yêu cầu gpg hỏi mật khẩu, cần thêm flag --no-symkey-cache, flag này sẽ rất cần thiết lúc testing.

CSGO, Cách lưu và chạy file config

09/01/2020 CSGO

Đây là hướng dẫn lưu và chạy file config trong game csgo. Dưới đây là ví dụ cụ thể, bạn muốn tập ném smoke, bạn chắc chắn sẽ phải gõ một đống lệnh mà bạn thậm chí không thể nhớ hết. Bạn không muốn mỗi lần tập ném smoke lại phải gõ một đống lệnh. Và ngay cả khi có copy/paste, nó cũng quá bất tiện.

Bài hướng dẫn dưới đây giúp bạn khắc phục vấn đề này. Dưới đây là chi tiết cách làm.

  1. Vào và tạo file tại thư mục
C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg

Tôi sẽ tạo file có tên là smk.cfg, lưu ý là đuôi file phải là .cfg

  1. Edit nội dung file và lưu lại
sv_cheats 1;
sv_infinite_ammo 1;
ammo_grenade_limit_total 5;
mp_warmup_end;
mp_freezetime 0;
mp_roundtime 60;
mp_roundtime_defuse 60;
sv_grenade_trajectory 1;
sv_grenade_trajectory_time 10;
sv_showimpacts 1;
mp_limitteams 0;
mp_autoteambalance 0;
mp_maxmoney 60000;
mp_startmoney 60000;
mp_buytime 9999;
mp_buy_anywhere 1;
mp_restartgame 1;

bind "ALT" "noclip";
  1. Trong game, vào console và chạy lệnh
exec smk

smk chính là tên file config vừa nãy tôi đã tạo.