Làm thế nào để Linux biết phân vùng trao đổi của nó ở đâu?


13

Tôi đã đọc rằng bạn cần đặt phân vùng trao đổi trên ổ cứng thay vì SSD.

Câu hỏi của tôi là như sau:

  • Khi nào và bằng cách nào "kiểm tra" được thực hiện bởi phân phối (hoặc một cái gì đó khác) để tìm phân vùng Hoán đổi của nó?
  • Có xảy ra trong khi khởi động?
  • Nó chỉ kiểm tra tất cả các đĩa có sẵn và tìm kiếm một phân vùng với cờ 'hoán đổi'?
  • Điều gì xảy ra nếu có một số phân vùng như vậy?
  • Ngoài ra, tôi cần có bao nhiêu phân vùng trao đổi nếu tôi chạy, ví dụ, hai bản phân phối khác nhau trên cùng một đĩa, giả sử Fedora và Ubuntu?

17
Lưu ý rằng một trao đổi trên SSD thực sự sẽ là một trao đổi thực sự tuyệt vời (macOS đang làm như vậy cho các lứa tuổi). Tuy nhiên, nó sẽ thực hiện đọc / ghi bổ sung vào SSD có thể làm giảm tuổi thọ của nó.
Nonyme

20
Bạn đã đọc trao đổi đó ở đâu trên ổ cứng chứ không phải SSD? Ngoài ra, bài báo hoặc bình luận bao nhiêu tuổi? SSD hiện đại tốt hơn nhiều ở mức độ hao mòn và không bị lỗi sau khi lặp đi lặp lại cách viết khi SSD còn mới. Ngoài ra, nếu bạn có một máy tính chỉ có SSD, thì bạn thực sự không có nhiều sự lựa chọn, ngoài việc không sử dụng trao đổi nào cả
JDS

2
@zakinster: Thế còn khi ổ 1TB của bạn luôn đầy? Nhu cầu lưu trữ đã tăng lên với các điều khoản lưu trữ.
Cuộc đua nhẹ nhàng với Monica

3
Nói cách khác, "vâng tôi đồng ý, trái với tuyên bố trước đây của tôi, kích thước thực tế của đĩa là không liên quan - đó là mức độ bạn đang sử dụng"
Lightness Races with Monica

6
@DavidSchwartz Và, nếu bạn "sử dụng trao đổi với số lượng đáng kể", trong khi SSD sẽ tạo ra sự mất hiệu năng hệ thống ít hơn đáng kể so với ổ cứng, thì lựa chọn tốt hơn vẫn là thêm RAM vào hệ thống hoặc giảm ảo bộ nhớ của khối lượng công việc của bạn theo một cách nào đó để ngăn chặn việc sử dụng trao đổi đáng kể. Cũng lưu ý rằng có một sự khác biệt giữa một hệ thống chạy dài đã lấp đầy trao đổi với dữ liệu gần như không bao giờ được sử dụng so với hệ thống đang tích cực hoán đổi và quét ...
twalberg

Câu trả lời:


24

Không gian hoán đổi được cấu hình tĩnh (loại mà hầu hết mọi phân phối sử dụng) được cấu hình /etc/fstabgiống như các hệ thống tệp.

Một mục thông thường trông giống như:

UUID=21618415-7989-46aa-8e49-881efa488132    none    swap     sw      0  0

Bạn cũng có thể thấy một trong hai discardhoặc nofailđược chỉ định trong trường cờ (trường thứ tư). Mỗi dòng như vậy tương ứng với một lĩnh vực trao đổi (nó không phải là một phân vùng, bạn có thể có các file swap, hoặc thậm chí toàn bộ đĩa swap).

Trong một số trường hợp thực sự cụ thể, thay vào đó bạn có thể có không gian hoán đổi được cấu hình động, mặc dù điều này khá hiếm vì nó có thể gây ra hành vi có vấn đề liên quan đến quản lý bộ nhớ. Trong trường hợp này, cấu hình được xử lý hoàn toàn bởi một thành phần không gian người dùng tạo và cho phép các tệp hoán đổi khi cần thiết trong thời gian chạy.

Theo như bạn cần bao nhiêu, đó là một câu hỏi phức tạp để trả lời, nhưng số lượng bản phân phối Linux khác nhau mà bạn dự định chạy không ảnh hưởng đến điều này trừ khi bạn muốn có thể chạy một bản phân phối trong khi bạn có chế độ ngủ đông khác (và bạn có lẽ không muốn làm điều này, vì đó là một cách thực sự dễ dàng để làm hỏng hệ thống của bạn).

Khi bạn chạy trình cài đặt cho hầu hết mọi bản phân phối chính (bao gồm Fedora, OpenSUSE, Linux Mint, Debian và Ubuntu), nó sẽ phát hiện bất kỳ phân vùng trao đổi hiện có nào trên hệ thống và thêm chúng vào cấu hình cho bản phân phối mà bạn cài đặt (ngoại trừ có thể nếu bạn chọn phân vùng thủ công) và trong hầu hết các trường hợp, điều này sẽ dẫn đến hệ thống được cấu hình một cách hợp lý.

Ngay cả bên cạnh đó, cá nhân tôi cũng khuyên bạn nên tránh có nhiều phân vùng trao đổi trừ khi bạn nói về một hệ thống máy chủ có nhiều đĩa, và thậm chí sau đó bạn thực sự cần biết những gì bạn đang làm để thiết lập để nó hoạt động tốt .


Nếu bạn có 2 bản phân phối Linux, bạn có thể có một phân vùng trao đổi cho hệ thống ... vì vậy bạn có thể cố gắng ngủ đông và tiếp tục ... (tốt hơn là sử dụng các người dùng khác nhau BTW và bạn cũng cần các /tmpphân vùng / thư mục khác nhau ). Có lẽ trong trường hợp đó tốt hơn là có máy ảo ...
Hastur

Vì vậy, những gì được đề xuất cho một người nên làm nếu họ có một phân vùng chuyên dụng để trao đổi trên cùng một ổ SSD mà HĐH Linux được cài đặt, tuy nhiên, dường như không thực sự có trao đổi hoặc được sử dụng. Nếu tôi chạy systemctl --all | grep swaptôi nhận lại hai kết quả. dev-disk-by\x2duuid-1c692cc4\x2df942\x2d4478\x2dad0f\x2d266b7484273a.swapswap.targetcả hai đều HOẠT ĐỘNG = không hoạt độngSUB = đã chết . Làm cách nào để hệ thống của tôi sử dụng vùng trao đổi?
Rockin4Life33

21

Hãy nói Fedora và Ubuntu?

Cả hai đều là hệ điều hành hiện nay.

Điều gì xảy ra trong hệ điều hành systemd

cơ chế tự nhiên

Systemd sử dụng các loại đơn vị. .mounttập tin đơn vị hướng dẫn nó để gắn kết khối lượng. .swaptập tin đơn vị hướng dẫn nó nói với kernel về phân vùng trao đổi. ( .servicecác tệp đơn vị hướng dẫn nó cách chạy các dịch vụ. V.v.) Đây là các cơ chế hệ thống gốc. Để ban hành chúng, systemd tự loại bỏ các tiến trình con thực hiện các cuộc gọi hệ thống có liên quan.

Nếu bạn sử dụng systemctllệnh (với --all) trên một hệ điều hành systemd như vậy, nó sẽ cho bạn biết về các .swapđơn vị được tải . Ví dụ:

dev-đĩa-by \ x2dpartuuid-40549710 \ x2d05.swap được tải hoạt động / dev / đĩa / by-partuuid / 40549710-05
dev
dev-sda5.swap đã tải hoạt động / dev / sda5

Nó cũng sẽ cho bạn biết về các .mountđơn vị.

Một quản trị hệ thống có thể thực sự viết như .swapfile đơn vị bằng tay, cũng giống như xe có thể viết .service, .socketvà các file đơn vị khác bằng tay. Bản thân systemd chỉ tìm các tệp đơn vị trong hệ thống tệp. Họ là cơ chế bản địa của nó.

Người ta thậm chí có thể lấy systemd để cho bạn thấy những gì trong các tệp đơn vị này và nơi có thể tìm thấy chúng trong hệ thống tệp:

$ systemctl cat dev-đĩa-by \\ x2duuid-1bb589e8 \\ x2d929f \\ x2d4041 \\ x2d81f4 \\ x2dff2b339b4e2a.swap 
# /run/systemd/generator/dev-disk-by\x2duuid-1bb589e8\x2d929f\x2d4041\x2d81f4\x2dff2b339b4e2a.swap
# Tự động được tạo bởi systemd-fstab-tạo

[Đơn vị]
SourcePath = / etc / fstab
Tài liệu = man: fstab (5) man: systemd-fstab-tạo (8)

[Hoán đổi]
Cái gì = / dev / đĩa / by-uuid / 1bb589e8-929f-4041-81f4-ff2b339b4e2a
Tùy chọn = sw
$ 

tập tin đơn vị được tạo tự động

Người ta có thể viết chúng bằng tay. Tuy nhiên, thông thường các tệp đơn vị .mountvà như vậy .swapđược tạo tự động bởi các chương trình được gọi là trình tạo . Hai máy phát điện như vậy là systemd-fstab-generatorsystemd-gpt-auto-generator. Cả hai đều chạy sớm trong quá trình bootstrap và đáp ứng với một systemctl daemon-reloadlệnh và (như bạn có thể thấy ở trên), chúng tạo ra toàn bộ tải các tệp đơn vị vào thư mục con không có giấy tờ /run/systemd/. Bản thân systemd chỉ sử dụng các tệp đơn vị được tạo .

Trình tạo trước đây đọc /etc/fstab, nhận ra một số phần mở rộng systemd cho định dạng tệp đó. Như tôi đã chỉ ra trong một bình luận câu trả lời, theo truyền thống phân vùng swap có loại gắn kết của swvà đó là cách người ta sẽ thấy rằng hệ điều hành khác nhận hồ sơ trao đổi trong bảng này. Nhưng phần mềm Linux đã thay thế việc nhận ra loại VFS thay thế, tìm kiếm swaploại VFS. systemd-fstab-generatorkhông phải là ngoại lệ ở đây, và đó là cách nó diễn giải /etc/fstabkhi chuyển đổi nó thành các cơ chế riêng.

Trình tạo sau xử lý bảng phân vùng EFI nằm trên cùng một đĩa chứa Phân vùng hệ thống EFI, tìm kiếm các mục trong bảng phân vùng EFI có nhiều loại phân vùng GUID nổi tiếng khác nhau . Một trong những GUID đó là GUID thông thường được gán cho các phân vùng trao đổi Linux; và nếu systemd-gpt-auto-generatortìm thấy một phân vùng có GUID đó (thỏa mãn các tiêu chí được đưa ra trong tài liệu hệ thống), nó sẽ tạo một .swapđơn vị cho nó; không /etc/fstabtham gia ở tất cả .

Tất nhiên, quá trình này có rất nhiều tác dụng phụ. Ví dụ: vì /etc/fstabkhông có khóa chính cho bảng, các bản ghi có thể có các trường "spec" và "file" trùng lặp (tức là "what" và "where"). Tuy nhiên, trong cơ chế systemd gốc, trường "file" (tức là "where") là một khóa duy nhất cho .mountcác đơn vị, được nhúng vào tên đơn vị. Không có hai .mountđơn vị có thể chia sẻ nó. Đối với .swapcác đơn vị, trường "spec" (tức là "cái gì") là khóa duy nhất cho các đơn vị. Không có hai .swapđơn vị có thể chia sẻ điều đó. Vì vậy, không phải tất cả các bản ghi /etc/fstabđều có thể chuyển đổi thành các cơ chế gốc và sẽ hoạt động, đặc biệt nếu mọi người thực hiện những việc như liệt kê cùng một điểm gắn kết cho hai mục đích khác nhau hoặc liệt kê cùng một phân vùng trao đổi theo hai cách khác nhau.

Tương tự, vì nó đã được dịch /etc/fstabsang cơ chế riêng và cơ chế riêng của systemd có các cách khác để kích hoạt các đơn vị , nên hành vi này rất khác so với các hệ điều hành không có hệ thống. Theo .mountmặc định, một đơn vị sẽ được kích hoạt tự độngsystemd-udevd , ngay cả sau khi bootstrap, đáp ứng với sự xuất hiện của thiết bị lưu trữ được gắn. Hoặc nó có thể được liệt kê dưới dạng một Wants=hoặc Requires=một số .servicehoặc .socketđơn vị, có nghĩa là nó sẽ được kích hoạt lại. Thậm chí còn có RequiresMountsFor=.

chương trình cài đặt và cách systemd

Theo truyền thống, các chương trình cài đặt hệ điều hành và quản trị viên hệ thống sau đó cấu hình lại hệ thống, có swcác mục nhập bằng văn bản /etc/fstab. Và đó là cách bản địa .mount.swapcác đơn vị cuối cùng được tạo tự động. Tiện ích cài đặt / cấu hình "biết" nơi đặt tệp hoán đổi, bởi vì trong giao diện người dùng của nó, quản trị viên hệ thống đã đưa ra một số lựa chọn và viết một /etc/fstabđể khớp. Đôi khi sự lựa chọn đó là tôi cần bạn tạo cho tôi một phân vùng trao đổi như là một phần của cài đặt. ; đôi khi chỉ cần sử dụng phân vùng trao đổi mà bạn đã tìm thấy trên đĩa. (trình cài đặt nhìn vào các loại phân vùng, quá).

Nhưng những người làm hệ thống có ý tưởng về các hệ điều hành tự động cấu hình từ một /etccây trống rỗng , được gọi là hệ thống không trạng thái , và đó là những cơ chế như trình tạo đọc bảng phân vùng EFI. Trong kế hoạch của người dùng hệ thống, không có /etc/fstab, và thực sự không có dữ liệu cấu hình liên tục nào /etccả, và tất cả những thứ này được suy luận từ nội dung của bảng phân vùng trên đĩa , ở mọi bootstrap và mọi lúc systemctl daemon-reload. Ngày nay họ đang quảng bá các chương trình cài đặt hệ điều hành hơn là không viết/etc/fstab .

Trong sơ đồ truyền thống, tất nhiên bạn thực sự có thể có mỗi hệ điều hành có phân vùng trao đổi riêng của nó và không để chúng chạm vào các phân vùng trao đổi của nhau. Và thực sự nếu bạn đang sử dụng chế độ ngủ đông để phân vùng thông qua phân vùng trao đổi và hy vọng có thể đa khởi động sang hệ điều hành khác trong khi ngủ đông ( đó là một ý tưởng rất tồirất dễ gây ra hỏng hóc hệ thống tệp theo cách này ) cần thiết.

Trong sơ đồ systemd, ngay cả khi hệ điều hành chưa được như người hệ thống dự tính và "không trạng thái", các máy phát điện nói trên vẫn chạy; và do đó, tất cả các phân vùng trao đổi (trên đĩa gốc / đĩa gốc) với loại phân vùng cần thiết sẽ được tự động sử dụng bởi tất cả các hệ điều hành systemd. Vì họ sẽ chia sẻ tất cả các phân vùng trao đổi được phát hiện tự động, nên người ta thực sự không cần tạo một phân vùng trao đổi cho mỗi hệ điều hành được cài đặt.

đọc thêm


Rất đẹp - cảm ơn bạn đã giải thích!
Andy Dalton

Có một phần trong tôi muốn thực sự bỏ phiếu cho bạn chỉ vì nói về systemd. Nhưng tất nhiên điều đó không công bằng (và cũng có hệ thống hoặc không có nghĩa là bạn sai) và tôi thường không bỏ phiếu vì dù sao nó dường như không bao giờ là cách thích hợp để mang tính xây dựng. Tuy nhiên, đây là một bài viết hay vì vậy mặc dù nhìn thấy các tài liệu tham khảo về Lennart, tôi đã bỏ phiếu cho câu trả lời này. Nếu không có gì khác bạn đặt nỗ lực vào nó và nó nên được khen ngợi. Tôi đã đọc ngắn gọn về rác rưởi không quốc tịch và đó là thứ gì đó ... Tôi thậm chí không chắc nó làm gì nên tôi sẽ để nó ở đó.
Pryftan

13

Trong lịch sử, phân vùng trao đổi được chỉ định trong /etc/fstab một mục nhập loại swap. Khi khởi động, các quá trình khởi động sẽ đọc tệp đó và đẩy cấu hình đó vào kernel.

Một ví dụ về mục trong /etc/fstablà:

/dev/sdb    none    swap     sw      0  0

Tôi không quen với cách systemdquản lý trao đổi, nhưng tôi tin rằng kết quả cuối cùng là như nhau: một quy trình không gian người dùng nhận thức được không gian nào được phân bổ cho trao đổi và quá trình không gian người dùng thông báo cho kernel.


Người hỏi đã hỏi về Linux, và điều này không sai đối với Linux; nhưng nó đặc biệt với Linux. Các hệ điều hành khác, chẳng hạn như FreeBSD, nhận ra các bản ghi hoán đổi /etc/fstabtừ swloại gắn kết thay vì từ swaploại VFS của chúng .
JdeBP

1
Câu trả lời không giải quyết tất cả các phần của câu hỏi.
Sergiy Kolodyazhnyy

Tôi cũng nên chỉ ra rằng câu trả lời này cũng đã lỗi thời trong thế giới của các hệ điều hành systemd. Nó không đưa vào tài khoản systemd-gpt-auto-generator.
JdeBP

2
Bạn có ý nghĩa gì khi systemd không sử dụng fstab? Tất nhiên là thế!
psusi

1
@psusi: systemd hiểu, nhưng không yêu cầu fstab.
MSalters

4

Tất cả các câu trả lời khác đề cập đến cách trỏ đến một hệ thống tập tin trao đổi khi khởi động.

Tuy nhiên, một số điểm để thêm vào các câu trả lời khác:

  • không gian trao đổi cũng có thể là một tập tin;
  • một phân vùng không gian hoán đổi được đánh dấu thường là loại 0x82;
  • bạn có thể gắn một không gian hoán đổi tại bất kỳ thời điểm nào trong thời gian chạy;
  • để đánh dấu / khởi tạo phân vùng / tệp, để nó được nhận dạng và sử dụng / gắn kết sau này dưới dạng không gian trao đổi, bạn cần sử dụng lệnh mkswap ;
  • để kích hoạt / sử dụng phân vùng / tệp trao đổi bằng tay, bạn sử dụng lệnh swapon;
  • Tương tự như vậy để hoán đổi nó, bạn đi với swapoff.
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.