Cắt với LVM và dm-crypt


21

Tôi đã cố gắng thiết lập TRIM với LVM và dm-crypt trên Ubuntu 13.04 theo hướng dẫn này:

http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/

Xem các ghi chú về cấu hình của tôi và quy trình thử nghiệm của tôi dưới đây.

Câu hỏi

  1. Có một thử nghiệm đáng tin cậy nếu TRIM hoạt động đúng?

  2. Là thói quen kiểm tra của tôi sai hoặc TRIM của tôi không hoạt động?

  3. Nếu nó không hoạt động: có gì sai với thiết lập của tôi?

  4. Làm cách nào tôi có thể gỡ lỗi TRIM cho thiết lập của mình và làm cho TRIM hoạt động?

Cấu hình

Đây là cấu hình của tôi:

cat /etc/crypttab

sda3_crypt UUID=[...] none luks,discard

cat /etc/lvm/lvm.conf

# [...]
devices  {
      # [ ... ]
      issue_discards = 1
      # [ ... ]
   }
# [...]

SSD là Samsung 840 Pro.

Đây là thủ tục kiểm tra của tôi

Để kiểm tra thiết lập tôi chỉ cần làm sudo fstrim -v /điều đó dẫn đến

/: [...] bytes were trimmed

Làm điều này một lần nữa dẫn đến kết quả /: 0 bytes were trimmedcó vẻ hợp lý và chỉ ra rằng TRIM dường như hoạt động.

Tuy nhiên sau đó tôi đã làm bài kiểm tra này:

dd if=/dev/urandom of=tempfile count=100 bs=512k oflag=direct

sudo hdparm --fibmap tempfile                                 

tempfile:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    5520384    5521407       1024
      524288    5528576    5529599       1024
     1048576    5523456    5525503       2048
     2097152    5607424    5619711      12288
     8388608    5570560    5603327      32768
    25165824    5963776    5980159      16384
    33554432    6012928    6029311      16384
    41943040    6275072    6291455      16384
    50331648    6635520    6639615       4096

sync

sudo hdparm --read-sector 5520384 /dev/sda                    

/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981

sudo rm tempfile

sync

sudo fstrim /

sync

sudo hdparm --read-sector 5520384 /dev/sda

/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981

Điều này dường như chỉ ra rằng TRIM không hoạt động. Kể từ khi

sudo hdparm -I /dev/sda | grep -i TRIM                        
       *    Data Set Management TRIM supported (limit 8 blocks)
       *    Deterministic read ZEROs after TRIM

Chỉnh sửa

Đây là đầu ra của sudo dmsetup table

lubuntu--vg-root: 0 465903616 linear 252:0 2048
lubuntu--vg-swap_1: 0 33308672 linear 252:0 465905664
sda3_crypt: 0 499222528 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 8:3 4096 1 allow_discards

Đây là /etc/fstab:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/lubuntu--vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda2 during installation
UUID=f700d855-96d0-495e-a480-81f52b965bda /boot           ext2    defaults        0       2
# /boot/efi was on /dev/sda1 during installation
UUID=2296-2E49  /boot/efi       vfat    defaults        0       1
/dev/mapper/lubuntu--vg-swap_1 none            swap    sw              0       0
# tmp
tmpfs /tmp tmpfs nodev,nosuid,noexec,mode=1777          0       0 

Chỉnh sửa:

Cuối cùng tôi đã báo cáo đó là một lỗi trong https://bugs.launchpad.net/ubfox/+source/lvm2/+orms/1213631

Hy vọng ai đó sẽ tìm thấy giải pháp ở đó hoặc ít nhất là kiểm tra thiết lập và xác minh lỗi.

Cập nhật

Bây giờ nó hoạt động, xem câu trả lời được chấp nhận.


LVM có vẻ là thiếu vứt bỏ, nên issue_discardskhông issue discardsnếu đó không phải là một lỗi đánh máy. allow_discardssẽ hiển thị trong bảng dmsetup cho các phân vùng LVM.
frostschutz

Xin lỗi, đây là một lỗi đánh máy. Tôi có issue_discards = 1trong tập tin cấu hình của tôi.
sinh viên

Nếu tôi là bạn, tôi sẽ thử sử dụng mục tiêu iSCSI và kiểm tra điều này thông qua tcpdump / wireshark để xem thiết lập có hoạt động hay không, mặc dù tôi không biết liệu mục tiêu iSCSI của Linux có hỗ trợ cắt hay không. Tôi tin rằng dm-crypt không nên làm trống các khối trên đĩa vật lý vì điều đó giúp dễ dàng bỏ qua không gian trống trên thiết bị khi cố gắng ép buộc nó (mặc dù tôi không biết liệu nó có làm điều đó hay không ). Ngoài ra, SSD không bắt buộc phải trả về số không sau khi xóa, vì mức độ hao mòn có thể chuyển hướng đọc sang một khối khác so với khối trống.
Didi Kohen

1
Theo bugzilla.redhat.com/show_orms.cgi?id=958096 Tôi đã hiểu nhầm vấn đề_discards = 1.
frostschutz

Câu trả lời:


23

Tôi đề nghị sử dụng một phương pháp thử nghiệm khác nhau. hdparmhơi lạ vì nó cung cấp địa chỉ thiết bị thay vì địa chỉ hệ thống tập tin và không nói địa chỉ nào liên quan đến thiết bị đó (ví dụ: nó giải quyết các phân vùng, nhưng không phải mục tiêu devicemapper, v.v.). Dễ dàng hơn nhiều để sử dụng một cái gì đó gắn với địa chỉ hệ thống tệp, theo cách đó nó phù hợp (có thể ngoại trừ các hệ thống tệp phi truyền thống như zfs / btrfs).

Tạo một tệp thử nghiệm: (không phải ngẫu nhiên trên mục đích)

# yes | dd iflag=fullblock bs=1M count=1 of=trim.test 

Lấy địa chỉ, độ dài và kích thước khối: (lệnh chính xác phụ thuộc vào filefragphiên bản)

# filefrag -s -v trim.test
File size of trim.test is 1048576 (256 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0    34048             256 eof
trim.test: 1 extent found

Nhận thiết bị và điểm gắn kết:

# df trim.test
/dev/mapper/something  32896880 11722824  20838512   37% /mount/point

Với thiết lập này, bạn có một tệp trim.testchứa đầy yes-potype /dev/mapper/somethingtại địa chỉ 34048có độ dài các 256khối 4096byte.

Đọc trực tiếp từ thiết bị sẽ tạo ra mô yeshình:

# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C
00000000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00100000

Nếu TRIM được bật, mẫu này sẽ thay đổi khi bạn xóa tệp. Lưu ý rằng bộ nhớ cache cũng cần phải được loại bỏ, nếu không ddsẽ không đọc lại dữ liệu từ đĩa.

# rm trim.test
# sync
# fstrim -v /mount/point/ # when not using 'discard' mount option
# echo 1 > /proc/sys/vm/drop_caches
# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C

Trên hầu hết các ổ SSD có kết quả là không có mẫu:

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000

Nếu mã hóa có liên quan, thay vào đó bạn sẽ thấy một mẫu ngẫu nhiên:

00000000  1f c9 55 7d 07 15 00 d1  4a 1c 41 1a 43 84 15 c0  |..U}....J.A.C...|
00000010  24 35 37 fe 05 f7 43 93  1e f4 3c cc d8 83 44 ad  |$57...C...<...D.|
00000020  46 80 c2 26 13 06 dc 20  7e 22 e4 94 21 7c 8b 2c  |F..&... ~"..!|.,|

Đó là bởi vì được cắt xén vật lý, lớp tiền điện tử đọc các số 0 và giải mã các số 0 đó thành dữ liệu "ngẫu nhiên".

Nếu mô yeshình vẫn tồn tại, rất có thể không có việc cắt tỉa nào được thực hiện.


1
@student: Tôi cảm thấy tồi tệ vì không nhận thấy điều này sớm hơn, đã chỉnh sửa câu trả lời để xóa bộ nhớ cache trước đó hexdump.
frostschutz

1
Cảm ơn, đó là điểm còn thiếu. Bây giờ nó có vẻ hoạt động!
sinh viên

2
Tôi vẫn không chắc liệu kernel có nên tự xóa bộ nhớ cache bất cứ khi nào nó cắt một cái gì đó trên SSD không. Bộ nhớ cache không được phép trả lại dữ liệu sai. Nó cũng là một sự lãng phí cho bộ nhớ cache nếu nó bị chiếm bởi một thứ không còn ở đó nữa ... ồ tốt.
frostschutz

1
@frostschutz Cảm ơn bạn vì giải pháp tuyệt vời này. Tôi đã tạo một kịch bản để tự động hóa quá trình nếu một người lười biếng đến đây.
desgua

1
Những người mới đến , xin lưu ý rằng lệnh TRIM sẽ không luôn luôn "điền vào" các khối ngay lập tức. Xem ở đây , ở đâyở đây . Mặc dù vậy, trong trường hợp của OP, vì hdparm -Ikết quả của anh ấy cho thấy "Số KHÔNG đọc quyết định sau TRIM".
Marc.2377

3

Thói quen kiểm tra của bạn là sai, bạn đang nhận được các số ngành liên quan đến thiết bị khối mà hệ thống tập tin nằm trên máy tính mà trong trường hợp này là một khối hợp lý. Khối lượng logic, tất nhiên, không bắt đầu ở khu vực đầu tiên của khối lượng vật lý (và thậm chí có thể không liền kề).

Ngay cả khi âm lượng logic bắt đầu ở khu vực 0 của âm lượng vật lý (không có âm lượng), thì âm lượng vật lý thực sự là một mục tiêu ánh xạ thiết bị khác, đây là mục tiêu để mã hóa. Và có lẽ có một tiêu đề LUKS ở phía trước, vì vậy các số ngành cũng không khớp ở đó.

Nếu bạn muốn làm việc thông qua ánh xạ số ngành vào đĩa bên dưới, dmsetup tablessẽ cung cấp cho bạn thông tin bạn cần. Nếu bạn dán nó ở đây, hãy chắc chắn rằng đó là phiên bản không hiển thị khóa trong đầu ra (thay vào đó sẽ hiển thị tất cả 0)! (Không có sự phục hồi nào từ việc tiết lộ khóa chính, nó không thể thay đổi được .itit còn tệ hơn nhiều so với tiết lộ mật khẩu).

Tôi đề nghị rằng để gỡ lỗi (một khi bạn đã xử lý ánh xạ khu vực), bạn bắt đầu ở mức thấp nhất và xác nhận nó hoạt động ở đó. TRIM một hệ thống tập tin trực tiếp trên / dev / sdaX và đảm bảo rằng nó hoạt động (hoàn toàn có khả năng thiết bị nằm và cắt không đọc lại số không). Sau đó, dm-crypt trên đó, và cắt một hệ thống tập tin trên đó, và đảm bảo nó hoạt động. Cuối cùng, đặt LVM lên hàng đầu và kiểm tra xem nó có hoạt động không.


@student OK, đó là lĩnh vực sai sau đó (hai đoạn đầu câu trả lời của tôi). Tôi sẽ chỉnh sửa câu trả lời của mình để xóa câu đó về sector 6575104, vì nó không còn phù hợp nữa.
derobert

Tôi không chắc chắn tôi nên dùng thiết bị nào dmsetup. Tôi vừa mới làm: sudo dmsetup table /dev/mapper/lubuntu--vg-rootđiều đó mang lại0 465903616 linear 252:0 2048
sinh viên

@student Điều đó có nghĩa là khu vực 0 nằm ở khu vực 2048 trên thiết bị 252: 0. Bạn sẽ phải tìm ra 252: 0 là gì, tôi đoán thiết bị mã hóa dm của bạn (đó là số chính và số phụ, sẽ hiển thị trong / dev chẳng hạn). Và bạn sẽ cần nhìn vào bảng cho thiết bị đó, để tiếp tục đuổi theo nó xuống một khối trên thiết bị bên dưới.
derobert

3

Đây chỉ là một kịch bản tôi muốn chia sẻ nếu một người lười biếng đến đây. Nó đã được thực hiện từ câu trả lời được chấp nhận từ frostschutz .

#! / bin / bash
#
# Kịch bản này được cung cấp "nguyên trạng" mà không có bảo hành dưới bất kỳ hình thức nào, được thể hiện hoặc ngụ ý, bao gồm, nhưng không giới hạn, các bảo đảm ngụ ý về tính thương mại, sự phù hợp cho một mục đích cụ thể hoặc không vi phạm.
#
# Giấy phép GPL2
#
# bởi desgua 2014/04/29

chức năng SẠCH {
cd "$ mì ống"
[-f test-trim-by-desgua] && rm test-trim-by-desgua && echo "Đã xóa tệp tạm thời"
tiếng vang "Tạm biệt"
thoát 0
}

tiếng vang của bẫy; tiếng vang "Đã hủy bỏ." ; DỌN DẸP; tiếng vang; thoát 0 'INT HUP

if [["$ (echo $ USER)"! = "root"]]; sau đó

đọc -n 1 -p 'Trở thành root? [Y / n] 'a
    nếu [[$ a == "Y" || $ a == "y" || $ a == ""]]; sau đó
        sudo $ 0 $ 1
        thoát 0
    khác
        tiếng vang "
        Kịch bản này cần đặc quyền root.
        "
        thoát 1

    fi

fi


tên = $ (tiếng vang $ 0 | sed 's /.*\///')
nếu [$ # -ne 1]; sau đó

tiếng vang "
Cách sử dụng: $ name / thư mục / đến / test /

"
thoát 1
fi

mì ống = $ 1

đọc -n 1 -p 'Sử dụng fstrim? [y / N] 'a
nếu [[$ a == "Y" || $ a == "y"]]; sau đó
    fs = 1
fi

phương thức =
trong khi [["$ phương thức"! = "1" && "$ phương thức"! = "2"]]; làm
đọc -n 1 -s -p 'Chọn phương thức:
[1] hdparm (sẽ thất bại trong LUKS trên LVM)
[2] filefrag (cảnh báo: bạn có thể phải buộc thoát - đóng thiết bị đầu cuối - trong một số trường hợp cắt thành công nếu bạn thấy một đầu ra không bao giờ kết thúc) 
' phương pháp
làm xong

chức năng SDATEST {
đĩa = $ (fdisk -l | grep / dev / sda)
if ["$ đĩa" == ""]; sau đó
tiếng vang "
fdisk không tìm thấy / dev / sda 
"
thoát 1
fi
}

chức năng KIỂM TRA {
tiếng vang "Entry /"; tiếng vang
cd $ mì ống
echo "Tạo tập tin test-trim-by-desgua tại $ pasta"; tiếng vang
dd if = / dev / urandom of = test-trim-by-desgua tính = 10 bs = 512k
echo "Đồng bộ hóa và ngủ 2 giây." ; tiếng vang
đồng bộ hóa
ngủ 2

hdparm --fibmap test-trim-by-desgua
lbab = $ (hdparm --fibmap test-trim-by-desgua | tail -n1 | awk '{print $ 2}')

echo "Như bạn có thể thấy, tệp đã được tạo và LBA của nó bắt đầu ở mức $ lbab"; tiếng vang

echo "Đồng bộ hóa và ngủ 2 giây." ; tiếng vang
đồng bộ hóa
ngủ 2

echo "Xóa tệp test-trim-by-desgua"; tiếng vang
kiểm tra rm-trim-by-desgua

tiếng vang của bẫy; tiếng vang; tiếng vang "Đã hủy bỏ." ; tiếng vang; thoát 0 'INT
echo "Đồng bộ hóa và ngủ 2 giây." ; tiếng vang
đồng bộ hóa
ngủ 2

if [["$ fs" == "1"]]; sau đó
    tiếng vang "fstrim $ pasta && ngủ 2"; tiếng vang
    fstrim $ mì ống
    ngủ 2
fi

echo "Điều này được đọc từ sector $ lbab:"
hdparm --read-sector $ lbab / dev / sda

pass = $ (hdparm --read-sector $ lbab / dev / sda | grep "0000 0000 0000 0000")

if [[$ pass == ""]]; sau đó
    tiếng vang "
Cắt thất bại ... 
Bạn sẽ chỉ thấy 0000 0000 0000 0000 ...
"
khác
    tiếng vang "Thành công !!!"
fi
thoát 0

}

chức năng LUKSTEST {
# Tham khảo: /unix/85865/trim-with-lvm-and-dm-crypt#
tiếng vang 1> / Proc / sys / vm / drop_caches
cd $ mì ống
echo "Tạo tệp \" yes \ "."
vâng dd iflag = fullblock bs = 1M đếm = 1 of = test-trim-by-desgua

# vị trí = `filefrag -s -v test-trim-by-desgua | grep "eof" | awk '{in $ 3}' `
vị trí = `filefrag -s -v test-trim-by-desgua | grep "eof" | quyến rũ | | | g; s |. * 255: || ; s | \. \ .. * || '`
[["$ location" == ""]] && echo "Không thể tìm thấy vị trí của tệp. Bạn có trên LUKS trên LVM không?" && DỌN DẸP;

thiết bị = `df test-trim-by-desgua | grep "dev /" | awk '{in $ 1}' `

có = `dd bs = 4096 bỏ qua = $ vị trí đếm = 256 if = $ thiết bị | hexdump -C`

echo "Trong dòng tiếp theo, bạn sẽ thấy một mẫu như: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy |
$ có
"

if [["` echo "$ yes" | grep "yyy" `" == ""]]; sau đó
    echo "Không thể kiểm tra mẫu. Đã xảy ra lỗi. Đã thoát."
    DỌN DẸP;
khác
    tiếng vang "Mẫu xác nhận."
fi

echo "Xóa tệp tạm thời." 
kiểm tra rm-trim-by-desgua

tiếng vang "Đồng bộ hóa."
đồng bộ hóa
ngủ 1

if [["$ fs" == "1"]]; sau đó
    tiếng vang "fstrim -v $ pasta && ngủ 2"; tiếng vang
    fstrim -v $ mì ống
    ngủ 2
fi

# Thả bộ nhớ cache
tiếng vang 1> / Proc / sys / vm / drop_caches

echo "Trong dòng tiếp theo, bạn nên ** KHÔNG ** thấy một mẫu có như: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy | 
Nếu bạn thấy, sau đó trim không hoạt động:
`dd bs = 4096 bỏ qua = $ vị trí đếm = 256 if = $ thiết bị | hexdump -C` "

có = `dd bs = 4096 bỏ qua = $ vị trí đếm = 256 if = $ thiết bị | hexdump -C`
if [["` echo "$ yes" | grep "yyy" `"! = ""]]; sau đó
    tiếng vang "TRIM không hoạt động."
khác
    tiếng vang "TRIM đang hoạt động!"
fi
DỌN DẸP;
}

if [["$ phương thức" == "1"]]; sau đó
    SDATEST;
    KIỂM TRA;
elif [["$ phương thức" == "2"]]; sau đó
    LỚN NHẤT;
fi
thoát 0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.