Sao chép laptop qua NVMe TCP
(copyninja.in)- Thay vì thiết lập lại laptop mới từ đầu, tác giả expose toàn bộ ổ đĩa của laptop cũ qua NVMe over TCP rồi sao chép nguyên trạng qua mạng
- Môi trường cũ dùng mã hóa toàn bộ ổ đĩa và ổ 512GB; laptop mới có NVMe 1TB nên sau khi sao chép cần mở rộng phân vùng, LUKS và BTRFS
- Việc xuất ổ đĩa không dùng
systemd-storagetm.service; thay vào đó khởi động cả hai laptop bằng GRML rescue CD và cấu hình bằngnvmet-tcpcùng/sys/kernel/config/nvmet - Quá trình sao chép thực tế dùng
dd; do laptop mới không có cổng Ethernet nên chỉ dùng WiFi, kết quả sao chép 512GB mất khoảng 7 giờ 30 phút, tốc độ khoảng 18–20MB/s - Sau khi sao chép, tác giả điều chỉnh để dùng toàn bộ 1TB thông qua
parted,growpart,cryptsetup resizevà BTRFS resize, gần như tiếp tục sử dụng nguyên môi trường laptop cũ
Xuất ổ đĩa cũ qua NVMe over TCP
-
Để không phải lặp lại quy trình thiết lập laptop mới, theo đề xuất của đồng nghiệp, tác giả chọn cách sao chép toàn bộ ổ đĩa của laptop cũ
-
Trước khi bắt đầu có hai trở ngại
- Không có dụng cụ để mở laptop cũ và kết nối ổ đĩa mới qua USB
- Laptop cũ dùng mã hóa toàn bộ ổ đĩa và ổ 512GB, còn laptop mới có NVMe 1TB nên cần thay đổi kích thước LUKS
-
Luồng công việc gồm ba bước: expose ổ đĩa, sao chép và mở rộng dung lượng
- Xuất ổ đĩa từ laptop cũ bằng
nvmet-tcp - Sao chép ổ đĩa đó trên laptop mới
- Mở rộng phân vùng ra toàn bộ 1TB
- Thay đổi kích thước LUKS
- Cuối cùng, thay đổi kích thước ổ root BTRFS
- Xuất ổ đĩa từ laptop cũ bằng
-
Dùng GRML thay cho systemd-storagetm.service
- Cách dễ nhất có thể là dùng systemd-storagetm.service
- Có thể gọi nó bằng cách chỉ định
rd.systemd.unit=storage-target-mode.targetđể boot vàostorage-target-mode.target - Tuy nhiên cách này yêu cầu đưa các dịch vụ mạng vào ảnh dracut initrd, và trong chế độ đó việc cấu hình WiFi khá phiền phức, nên tác giả bỏ qua
- Thay vào đó, tác giả boot cả hai laptop bằng GRML rescue CD, rồi trên laptop cũ xuất ổ NVMe bằng module
nvmet-tcpcủa Linux
modprobe nvmet-tcp cd /sys/kernel/config/nvmet mkdir ports/0 cd ports/0 echo "ipv4" > addr_adrfam echo 0.0.0.0 > addr_traaddr echo 4420 > addr_trsvcid echo tcp > addr_trtype cd /sys/kernel/config/nvmet/subsystems mkdir testnqn echo 1 >testnqn/allow_any_host mkdir testnqn/namespaces/1 cd testnqn # replace the device name with the disk you want to export echo "/dev/nvme0n1" > namespaces/1/device_path echo 1 > namespaces/1/enable ln -s "../../subsystems/testnqn" /sys/kernel/config/nvmet/ports/0/subsystems/testnqn- Với cấu hình này, thiết bị đích được expose dưới dạng NVMe over TCP
- Trên laptop mới, tìm kiếm và kết nối tới thiết bị đã xuất
nvme discover -t tcp -a <ip> -s 4420 nvme connectl-all -t tcp -a <> -s 4420- Sau đó có thể kiểm tra thiết bị được kết nối trên laptop mới bằng
nvme listvà tiến hành sao chép ổ đĩa
Sao chép ổ đĩa và thay đổi kích thước
-
Sao chép 512GB bằng
dd- Việc sao chép ổ root được thực hiện bằng lệnh
dd - Do laptop mới không có cổng Ethernet nên chỉ dùng WiFi, việc sao chép toàn bộ 512GB mất khoảng 7 giờ 30 phút
- Tốc độ truyền khoảng 18–20MB/s
- Các lựa chọn khác là tạo sẵn phân vùng và hệ thống tệp ban đầu rồi dùng
rsyncđể sao chép ổ root, hoặc dùng cơ chế truyền hệ thống tệp của chính BTRFS
dd if=/dev/nvme2n1 of=/dev/nvme0n1 status=progress bs=40M - Việc sao chép ổ root được thực hiện bằng lệnh
-
Mở rộng phân vùng, LUKS và BTRFS
partedphát hiện bảng phân vùng không khớp với kích thước ổ đĩa, sau khi hỏi xác nhận đã tự động sửa- Để mở rộng phân vùng thứ hai, tác giả cài
cloud-guest-utilsvà dùnggrowpart
growpart /dev/nvem0n1 p2- Ở bước tiếp theo, dùng
cryptsetupđể tăng kích thước container LUKS
cryptsetup luksOpen /dev/nvme0n1p2 ENC cryptsetup resize ENC- Sau khi boot lại từ ổ đĩa và xác nhận hoạt động bình thường, tác giả đăng nhập rồi thay đổi kích thước hệ thống tệp BTRFS
- Với BTRFS, hệ thống phải được mount để thay đổi kích thước, nên không thể thử trong trạng thái live boot
btfs fielsystem resize max /- Kết quả là trên laptop mới, tác giả có được môi trường như thể vẫn đang dùng tiếp laptop cũ
- Thông thường cần khoảng 1–2 tuần để hoàn toàn thích nghi với laptop mới, nhưng cách này đã rút ngắn thời gian đó
- Ngoài ra, tác giả cũng học được cách xuất ổ đĩa qua NVMe over TCP
1 bình luận
Ý kiến trên Hacker News
Trong kịch bản của tác giả, rốt cuộc chỉ thực hiện sao chép khối tuần tự bằng
dd(1), nên gần như không có lợi ích gì khi dùng NVMe/TCP. Lệnh phức tạp có thể được thay bằngnetcatđơn giảnLaptop đích:
$ nc -l -p 1234 | dd of=/dev/nvme0nX bs=1MLaptop nguồn:
$ nc x.x.x.x 1234ddở phía đích dùng để buffer thao tác ghi nhằm làm nhanh và hiệu quả hơn. Nếu thêmgzip/gunzipở nguồn/đích thì sẽ nhanh hơn nhiều khi đĩa chưa đầy và có nhiều khối 0. Cá nhân tôi thích nhất cách này khi tạo image PC qua mạng và đã làm nhiều lầnTrên GigE, nén thường trở thành nút thắt cổ chai, nên nên truyền
--fastchogzip; tốt hơn nữa là dùng lz4/unlz4 thay chogzip/gunzipthì sẽ nhanh hơn. Trước đây khi image một laptop Windows mới có NVMe 1TB qua GigE, mất khoảng 20 phút, và vì dung lượng trống được nén gần như về 0 nên image kết quả chỉ 20GB. Thường tôi sao lưu image lz4 đó, rồi vài năm sau khi đem tặng laptop thì khôi phục bằngunlz4 | dd, rất tiệnTuy nhiên tôi không biết đến module kernel Linux
nvme-tcp, ngày nào cũng học được điều mới. Cái này có vẻ hữu ích hơn cho việc mount filesystem trên NVMe từ xa, thay vì truy cập thô bằngddNgoài ra, kích thước pipe buffer tối đa của Linux là 64kB, nên về mặt kỹ thuật tham số
dd bs=Xkhông cần lớn hơn mức đó. Dù vậybs=1Mkhông gây hại và sẽ gom các lần đọc 64kB cho đến khi đủ 1MB, đồng thời cũng phòng khi kích thước pipe tăng trong tương lai. Một số phiên bảnnetcatcó tùy chọn kích thước khối I/O nên không cầndd bs=X, nhưngnetcattrên đĩa cứu hộ thường là phiên bản không có tùy chọn đópvthay choddở cả hai phía thì không phải lo chỉ định kích thước khối phù hợp, và còn có biểu đồ tiến độ đẹp mắttestdisk, nhưng trước đó không muốn động vào các đĩa đã hỏng, nên đã sao chép khoảng 40TB bằng đĩa flash cứu hộ,netcatvà ổ đĩaMột số máy chủ có toàn bộ khe RAID vật lý đều đã đầy nên cũng không dùng được khe đĩa dự phòng; đại khái tôi dùng
dd if=/dev/sdc bs=xxx | gzip | nc -l -p 8888và lệnh ngược lại ở phía bên kia. Bất ngờ là nó chạy tốt. Một điểm cần chú ý là thử khớp tổ hợpdd bsvới kích thước sector, vì kích thước phù hợp ảnh hưởng lớn đến thông lượng củaddddnày có thể gây hư hỏng. Để tránh bị cắt khối, cầniflag=fullblock, và dù có thể là thói quen mù quáng,conv=synccũng không gây hại. Cá nhân tôi thích đơn giản lànc -l -p 1234 > /dev/nvme0nXNếu đưa
pvvào pipeline thì có thể xem thời gian hoàn tất dự kiến, nhưng có thể ảnh hưởng đôi chút đến hiệu năngCảm ơn AWS/Annapurna/Nitro/Lightbits đã đưa NVMe-over-TCP vào Linux
https://www.techtarget.com/searchstorage/news/252459311/Ligh...
“Liên minh NVM Express đã phê chuẩn NVMe/TCP làm tầng truyền tải binding vào tháng 11/2018. Tiêu chuẩn này phát triển từ nền tảng mã do đội ngũ kỹ thuật Lightbits ban đầu gửi lên NVM Express.”
https://www.lightbitslabs.com/blog/linux-distributions-nvme-...
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/lin...
Trông rườm rà hơn nhiều so với cách bên dưới:
nbdkit file /dev/nvme0n1,nbdcopy nbd://otherlaptop localfilenbdcopycó thể xử lý file thưa, có thể đặt số kết nối và số luồng theo số core, có thể ép flush trước khi kết thúc và cũng bật được thanh tiến độ. Nếu là ổ chưa mã hóa thì cũng hỗ trợ TLSGần đây tôi phải cài xubuntu trên một laptop mới. Trước đây tôi thường clone, nhưng lần này muốn sắp xếp lại một số cấu hình
Việc truyền 10Gb/s bằng cáp USB-C thật sự hữu ích, vì lựa chọn khác chỉ còn WiFi
Cắm hai máy tính vào nhau là một mạng tạm thời được hình thành, rồi chỉ cần chuyển bằng
rsync. Nhìn thì có vẻ đường truyền đã bão hòa, nên dùng giao thức khác cũng không có nhiều ý nghĩa. Tất nhiên học cái mới là tốt, nhưng có thể không phải vào lúc đang clone laptopBản thân việc truyền thì cực nhanh, chuyển 1TB chỉ trong vài phút. Lần này không dùng mã hóa nên đơn giản hơn nhiều
Tôi không hiểu vì sao lại không pipe btrfs qua mạng. Trước tiên tạo snapshot btrfs, rồi làm
btrfs send => nc => network => nc => btrfs receivethì chỉ các block đang được dùng mới được truyềnbtrfs send/receivequa SSH và nó chạy rất tốt. Có lẽ cũng có thể dễ dàng dựng SSH server trong phiên live GRMLTuy nhiên có một điểm cần lưu ý. Trong btrfs không thể gửi snapshot theo cách đệ quy, nên nếu có nhiều snapshot đệ quy thì việc mirror cùng cấu trúc sang đĩa mới tương đối khó. Điều đó có thể xảy ra với Docker/LXD/Incus. Tôi thích btrfs, nhưng send/receive đệ quy là phần ZFS làm tốt hơn
Gần đây tôi phải sao chép khoảng 200GB file qua WiFi. Tôi dùng
rsyncđể khi kết nối lỗi không phải bắt đầu lại từ đầu, và để không mất dữ liệu, nhưng mất ít nhất 6 giờ. Không biết có cách nào tốt hơn khôngVà tôi cũng tò mò cách dùng
ddmang lại bảo đảm gì. Có phải so sánh md5 của block device kết quả không?WiFi có nhiều nguyên nhân gây nghẽn hiệu năng hơn hẳn. Chỉ cần nối ít nhất một thiết bị với router bằng cáp, còn thiết bị kia để không dây, cũng đã giúp khá nhiều
rsyncchỉ truyền từng file một. Có thể chia danh sách file bằngxargs/parallelđể chạy nhiều instancersync, hoặc dùng thứ nhưrclonevốn hỗ trợ truyền song song-zkhông. Nếu dùng được Ethernet thì trên phần lớn thiết bị có thể gần 100MB/s, tức khoảng 35 phútrsynclà SSH thì thường chính nó là nút thắt. OpenSSH trước đây từng có các giới hạn hiệu năng kỳ lạ, và có thời phải dùng một bản vá ít người biết để обход qua. Nếu CPU không phải nút thắt, bật nén cũng có ích“Trong mạng máy tính, đa truy cập cảm nhận sóng mang tránh va chạm (CSMA/CA) là một phương thức đa truy cập mạng sử dụng cảm nhận sóng mang, nhưng cố tránh va chạm bằng cách chỉ bắt đầu truyền sau khi kênh được phát hiện là ‘rỗi’. Khi truyền, nút gửi toàn bộ dữ liệu gói
Điều này đặc biệt quan trọng trong mạng không dây, nơi không thể dùng CSMA/CD, cơ chế phát hiện va chạm, vì bộ phát không dây khiến bộ thu bị mất nhạy và gần như tắt trong lúc truyền gói
CSMA/CA kém tin cậy do vấn đề nút ẩn
CSMA/CA là một giao thức hoạt động ở tầng liên kết dữ liệu.”
https://en.wikipedia.org/wiki/Carrier-sense_multiple_access_...
Cách tiếp cận này hẳn có ưu điểm, nhưng trước đây khi chuyển laptop, tôi chạy trình cài đặt ở cả hai bên rồi kết hợp
ddvớinc. Theo trí nhớ thì tôi còn thêm gzip để truyền các vùng null lớn nhanh hơnNếu laptop mới không có cổng Ethernet, cách hacky của tôi có thể đã nhanh hơn một chút nhờ nén. Vì với một liên kết mạng tốc độ cao, hẳn nó vẫn chưa chạm tới giới hạn mà nén bổ sung gây ra
Cứ dùng Clonezilla là được mà? Nó chỉ sao chép các block dữ liệu thực sự và cũng có thể tự động chỉnh kích thước phân vùng. Tôi luôn làm như vậy
Tất nhiên thường thì tôi tháo đĩa NVMe khỏi laptop rồi cắm vào dock tốc độ cao
Vẫn chưa đến mức có thể hoàn toàn tin tưởng rồi bỏ mặc. Backup không giống với backup cộng restore, nên nên thử nghiệm. Clonezilla cũng có thể gặp vấn đề khi tạo lại phân vùng trên một đĩa rất khác so với bản gốc
Đã hàng chục năm rồi tôi không thực sự “cài” hệ điều hành lên desktop hay laptop; tôi luôn sao chép file rồi chỉ chỉnh những phần cần thiết. Thường thì tôi nhân dịp này tạo filesystem mới rồi chuyển file bằng
rsync, để cập nhật các tham số như loại filesystem hay kích thước block, mã hóa, v.v.Dù vậy, nếu là kiểu người lên kế hoạch trước, có lẽ một cách khai báo hơn như NixOS, nơi chỉ sao chép cấu hình còn phần còn lại tự động cài lại, sẽ tốt hơn
Nếu kết nối trực tiếp các thiết bị bằng WiFi mà không qua AP trung gian, có lẽ có thể tăng gấp đôi tốc độ truyền. Trong tình huống này thì đáng để thử