Là dấu gạch chéo (/) trong tên của thư mục gốc Linux?


46

Slash ( /) có thực sự là một phần của tên của thư mục gốc Linux không? Hay nó chỉ là một biểu tượng cho nó?

Những gì về /etcvà như vậy?

Cập nhật

Giả sử /dev/sda2là thiết bị khối của thư mục gốc Linux.

$ sudo gỡ lỗi / dev / sda2
gỡ lỗi 1.44.1 (24 tháng 3 năm 2018)
gỡ lỗi:   pwd
[pwd] INODE: 2 ĐƯỜNG: /
[root] INODE: 2 ĐƯỜNG: /
gỡ lỗi:   stat /
Nút: 2    Loại: thư mục     Chế độ: 0755 Cờ: 0x80000
Thế hệ: 0 Phiên bản: 0x00000000: 00000077
Thành viên: 0 Nhóm: 0 Dự án: 0 Kích thước: 4096
Tệp ACL: 0
Liên kết: 25 Blockcount: 8
Mảnh vỡ: Địa chỉ: 0 Số: 0 Kích thước: 0
 ctime: 0x5b13c9f1: 3f017990 - Chủ nhật ngày 3 tháng 6 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - Chủ nhật ngày 3 tháng 6 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - Chủ nhật ngày 3 tháng 6 15:28:57 2018
thời gian: 0x5aad1843: 00000000 - Thứ bảy 17 16:59:39 2018
Kích thước của các trường inode thêm: 32
NGOẠI TRỪ:
(0): 9249

Vì vậy, có một thư mục trong đó, inode # 2, nhưng nó không có tên.


1
Về cập nhật gần đây của bạn cho thấy một số debugfsđầu ra. Bạn có thể làm rõ làm thế nào điều này thay đổi câu hỏi?
Kusalananda

Nó không. Tôi chỉ muốn hoàn thành các câu trả lời. nhưng tôi không muốn thêm cái khác Vì vậy, tôi đã cập nhật nó. nếu bạn có thể đặt dòng kẻ lừa đảo trong câu trả lời của bạn sẽ xóa chúng
mlibre

Câu trả lời:


61

Tiêu chuẩn POSIX.1-2008 nói

Một tên đường dẫn bao gồm một /sẽ giải quyết thư mục gốc của quá trình. Một tên đường dẫn null sẽ không được giải quyết thành công.

Tiêu chuẩn tiếp tục tạo ra sự khác biệt giữa tên tệptên đường dẫn . /là tên đường dẫn cho đường dẫn của thư mục gốc. Tên của thư mục là "thư mục gốc", nhưng trong hệ thống tập tin thì không tên, nó không có tên tệp. Nếu nó có tên tệp, tên đó sẽ là một mục nhập thư mục trong thư mục phía trên thư mục gốc và không có thư mục đó.

Ký tự /không bao giờ có thể là một phần của tên tệp vì nó là dấu phân cách đường dẫn.

Để rõ ràng: /không phải là tên của thư mục gốc, mà là đường dẫn đến nó, tên đường dẫn của nó .

/etclà một tên đường dẫn khác. Nó là tên của đường dẫn tuyệt đối đến etcthư mục. Tên của thư mục tại đường dẫn đó là etc(tên tệp của nó là etc).

/usr/local/bin/curllà tên đường dẫn của curltệp thực thi theo cùng một cách /etclà tên đường dẫn của etcthư mục.


"Nếu nó có một tên tệp, tên đó sẽ là một mục nhập thư mục trong thư mục phía trên thư mục gốc" Đó sẽ là hai thứ, về mặt kỹ thuật - số inode và tên (mà như chúng ta biết là inode 2). Thật thú vị khi lưu ý rằng /..các điểm quay lại //có mục nhập thư mục cho chính nó - đó là cái cũ tốt /.; tất cả 3 điều đó đều chỉ vào cùng một nút - 2.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Về mặt kỹ thuật , thư mục gốc là "per-process", vấn đề quan trọng trong môi trường chroot. Trong một chroot, số inode của thư mục gốc sẽ không phải là một số cụ thể (nó sẽ là số inode của gốc chroot). Ngoài ra, tôi nghĩ rằng số 2 (trong các tình huống không được biên dịch) phụ thuộc vào hệ thống tập tin được sử dụng.
Kusalananda

Tôi cũng nhận thấy rằng nó /được định nghĩa theo thuật ngữ gốc theo quy trình nhưng tôi không biết rằng inode chrootkhông nhất thiết phải là 2. Thực tế rất thú vị. Nó cũng đặt ra một câu hỏi về /thư mục cho các tiến trình kernel đặc quyền là gì . Điều đó có nghĩa là chỉ các quá trình không gian người dùng có /liên kết với chúng?
Sergiy Kolodyazhnyy

37

dấu gạch chéo là dấu phân cách ; tên thư mục không bao gồm dấu phân cách, nhưng tên đường dẫn đầy đủ bao gồm dấu phân cách.

Vì vậy, "cấp độ gốc" / không có tên . Trên hầu hết các hệ thống giống Unix, điều này được coi là trường hợp đặc biệt như ...(mặc dù tất nhiên không có sự khác biệt giữa hai hệ thống ở cấp gốc).

Danh pháp có thể khác nhau. Ví dụ, POSIX.1-2017 liệt kê một số định nghĩa thường được sử dụng :

  • 3.2 Tên đường dẫn tuyệt đối

    Một tên đường dẫn bắt đầu bằng một hoặc nhiều hơn hai <slash>ký tự; xem thêm Tên đường dẫn .

  • 3.271 Tên đường dẫn

    Một chuỗi được sử dụng để xác định một tập tin. Trong ngữ cảnh của POSIX.1-2008, tên đường dẫn có thể bị giới hạn ở các byte {PATH_MAX}, bao gồm cả byte null kết thúc. Nó có các <slash>ký tự bắt đầu tùy chọn , theo sau là 0 hoặc nhiều tên tệp được phân tách bằng các <slash>ký tự. Một tên đường dẫn có thể tùy ý chứa một hoặc nhiều <slash>ký tự dấu . Nhiều <slash>nhân vật liên tiếp được coi là giống nhau <slash>, ngoại trừ trường hợp có chính xác hai <slash>nhân vật chính.

    Lưu ý: Nếu tên đường dẫn chỉ bao gồm các byte tương ứng với các ký tự từ bộ ký tự tên tệp di động (xem Bộ ký tự tên tệp di động ), các <slash>ký tự và một kết thúc đơn<NUL>ký tự, tên đường dẫn sẽ có thể được sử dụng dưới dạng chuỗi ký tự trong tất cả các ngôn ngữ được hỗ trợ; mặt khác, tên đường dẫn chỉ có thể là một chuỗi (chứ không phải là một chuỗi ký tự). Ngoài ra, do mã hóa một byte của <slash>ký tự được yêu cầu giống nhau trên tất cả các vị trí và không xảy ra trong một ký tự nhiều byte, nên các tham chiếu đến một <slash>ký tự trong tên đường dẫn được xác định rõ ngay cả khi tên đường dẫn không phải là ký tự chuỗi. Tuy nhiên, thuộc tính này không nhất thiết phải giữ cho các ký tự còn lại trong bộ ký tự tên tệp di động.

  • 3.272 Thành phần tên đường dẫn

    Xem Tên tệp trong Tên tệp .

  • Tên tệp 3.170

    Một chuỗi các byte bao gồm từ 1 đến {NAME_MAX}byte được sử dụng để đặt tên cho một tệp. Các byte soạn tên sẽ không chứa <NUL>hoặc <slash>ký tự. Trong ngữ cảnh của một tên đường dẫn, mỗi tên tệp sẽ được theo sau bởi một <slash>hoặc một <NUL>ký tự; ở nơi khác, tên tệp được theo sau bởi một <NUL>ký tự tạo thành một chuỗi (nhưng không nhất thiết phải là một chuỗi ký tự). Tên tập tin chấmdot-dotcó ý nghĩa đặc biệt. Một tên tệp đôi khi được gọi là "thành phần tên đường dẫn". Xem thêm Tên đường dẫn .

Vì vậy, ... nếu bạn đang tìm kiếm làm rõ , đó có thể không phải là điểm dừng đầu tiên của bạn. Các hướng dẫn như trang Khái niệm UNIX này rất hữu ích, ví dụ: chỉ ra rằng "tên đường dẫn đầy đủ" đồng nghĩa với "tên đường dẫn" tuyệt đối.


3
Nitpick: dot và dot-dot là tên tệp, không phải tên đường dẫn. Trên thực tế, tiêu chuẩn POSIX có công thức gây tò mò "Như một trường hợp đặc biệt, trong thư mục gốc, dấu chấm có thể đề cập đến chính thư mục gốc." (nhấn mạnh của tôi).
Kusalananda

Vì vậy, đọc đặc tả cho chữ cái, /không phải là tên tệp hợp lệ hoặc thành phần tên đường dẫn và nó không phải là một chuỗi chứa các thành phần đó nhưng nó vẫn là một tên đường dẫn hoàn toàn hợp lệ cho một thư mục nhất định. Cái phải tồn tại, mặc dù phần yêu cầu này không đề cập đến "tên" của nó. Bằng cách nào đó, tôi thấy điều này hơi thú vị.
ilkkachu

Nó đã được trả lời trong POSIX : Nó có các ký tự bắt đầu tùy chọn, theo sau là 0 hoặc nhiều tên tệp được phân tách bằng các ký tự.
Thomas Dickey

@Kusalananda xem xét lý do đặc tả cho sự nhấn mạnh của bạn. các tháng trong định nghĩa spec là một tuyên bố rõ ràng về bảo lãnh liên quan đến kiểm tra thực hiện. nơi có thể được sử dụng, thông số kỹ thuật đảm bảo bất kỳ hành vi vừa chớm nở nào của hành vi được xác định. nói cách khác, bất kỳ thực thể dựa vào ..tại /liên kết /.
mikeerv

19

Trong Unix, các tệp (và thư mục chỉ là tệp) không có "tên". Liên kết có tên, liên kết là các mục trong một thư mục ánh xạ tên thành tệp.

Bạn có thể nói, rằng các liên kết cung cấp cho tên các tập tin, nhưng lưu ý: điều này có nghĩa rằng một tập tin có thể có nhiều hơn một tên, vì nó có thể có nhiều hơn một liên kết.

Vì thư mục gốc là thư mục gốc, không có thư mục "cao hơn" trong đó có thể có một liên kết đến nó, vì vậy không thể có một tên liên quan đến nó. Về mặt lý thuyết có thể thêm một liên kết vào thư mục gốc trong một số thư mục khác, nhưng hầu hết các Unice đều cấm thêm liên kết vào các thư mục hiện có, vì nó có thể dẫn đến các chu kỳ trong hệ thống phân cấp tệp (thực sự là một biểu đồ có hướng) và phát hiện các chu kỳ trong một biểu đồ là tốn kém, nhưng không phát hiện ra chúng có thể dẫn đến đệ quy vô hạn khi cố gắng giải quyết các tên trong kernel.

Vì vậy, về cơ bản, thư mục gốc không có tên, vì không có thư mục nào ở trên mà chúng ta có thể ghi lại tên.

Như đã chỉ ra trong các câu trả lời khác, chúng ta cần phân biệt giữa tên và đường dẫn (tên). Thư mục gốc có thể được gọi qua đường dẫn (tên) /.


Có, các tệp có thể có nhiều hơn một tên, giống như mọi người. Chồng của con gái tôi thường đi bằng tên đệm của anh ấy, nhưng rõ ràng anh ấy cũng phải trả lời tên của mình. Tên chính của thư mục gốc là "/", phát âm là "dấu gạch chéo", vì tên đường dẫn tuyệt đối của nó là "/" (và tên dựa trên tên đường dẫn tương đối không đặc biệt hữu ích). (Gọi nó là "root" có nguy cơ nhầm lẫn với "/ root", nên luôn được gọi là "slash root".
Monty Harder

1
Tôi thích điểm mà nó không có tên vì không có thư mục cao hơn để ghi tên đó. Điều đó làm rõ khái niệm độc đáo.
Joe

7

Việc sử dụng từ "tên" là một chút linh hoạt; nó có thể đề cập đến một "tên đường dẫn đủ điều kiện"; nó có thể đề cập đến "mục nhập thư mục"; nó có thể đề cập đến "tên tệp" được truyền cho các chức năng hoặc thói quen khác nhau.

Vì vậy, ví dụ, /etc/foo/var/tmp/../../etc/foo/tmp/../../../../../../foolà những cách đề cập đến cùng một tập tin; tất cả đều là tên hợp lệ , như footrong /etcthư mục.

Vì vậy, hãy quay trở lại vấn đề cơ bản.

Một tên tệp trong unix được tạo thành từ các thành phần được phân tách bằng dấu phân cách thư mục /. Khá nhiều hạn chế duy nhất đối với các thành phần là chúng không thể chứa các /ký tự hoặc NUL; bất cứ điều gì khác được cho phép.

Vì vậy, "tên đường dẫn đủ điều kiện" của /etclà chuỗi đầy đủ : /etc. Điều này có nghĩa là nó có etcthành phần trong thư mục gốc.

Tương tự như vậy /x/y/z/foosẽ có foothành phần trong /x/y/zthư mục.

Bây giờ thư mục gốc là duy nhất ở chỗ nó không có thành phần nào trong thư mục mẹ; nó chỉ có tên đường dẫn đầy đủ như tên của nó : /.

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.