Làm cách nào để thay đổi thư mục trang chủ Cygwin sau khi cài đặt?


121

Tôi vừa cài đặt Cygwin và có vẻ như thư mục chính trong dấu nhắc bash nằm trên ổ đĩa Z: của tôi. Đó không phải là nơi tôi muốn.

Làm cách nào để thay đổi điều này?


1
Đối với những người sử dụng Cygwin 1.7.34 trở lên, hãy sử dụng các phương pháp được giải thích trong các bài viết khác, nhưng đừng quên xóa dấu # trước đó db_home:để hủy trích dẫn và làm cho nó hoạt động.
Maieul

Câu trả lời:


180

Bắt đầu với Cygwin 1.7.34 , cách được khuyến nghị để làm điều này là thêm db_homecài đặt tùy chỉnh vào /etc/nsswitch.conf. Một mong muốn phổ biến khi làm điều này là làm cho thư mục chính Cygwin của bạn ngang bằng với thư mục hồ sơ người dùng Windows của bạn. Cài đặt này sẽ thực hiện điều đó:

db_home: windows

Hoặc, tương đương:

db_home: /%H

Bạn cần sử dụng biểu mẫu sau nếu bạn muốn một số biến thể trên lược đồ này, chẳng hạn như để tách các tệp trang chủ Cygwin của bạn thành một thư mục con của thư mục hồ sơ người dùng Windows của bạn:

db_home: /%H/cygwin

Có một số chương trình thay thế khác cho windowstùy chọn cộng với một số %mã thông báo khác mà bạn có thể sử dụng thay thế %Hhoặc bổ sung cho nó. Xem các nsswitch.confmô tả cú pháp trong tài Cygwin Hướng dẫn để biết chi tiết.

Nếu bạn đã cài đặt Cygwin trước 1.7.34 hoặc đã chạy mkpasswdtiện ích của nó để bạn có /etc/passwdtệp, bạn có thể thay đổi thư mục chính Cygwin của mình bằng cách chỉnh sửa mục nhập của người dùng trong tệp đó. Thư mục chính của bạn là phần tử thứ hai đến cuối cùng trên dòng của người dùng của bạn trong /etc/passwd

Cho dù bạn làm theo cách nào, điều này sẽ khiến HOMEbiến môi trường được đặt trong quá trình khởi động trình bao.²

Xem mục Câu hỏi thường gặp này để biết thêm về chủ đề.


Chú thích:

  1. Thay vào đó, hãy cân nhắc di chuyển /etc/passwd/etc/grouptránh xa để sử dụng cơ chế dựa trên SAM / AD mới .

  2. Mặc dù có thể thiết lập đơn giản %HOME%thông qua Control Panel, nhưng nó chính thức không được khuyến khích . Nó không chỉ ghi đè lên các cơ chế trên mà không phải lúc nào cũng hoạt động, chẳng hạn như khi chạy các tập lệnh shell qua cron.


3
Lưu ý rằng nếu bạn đã cài đặt Git bash shell từ git-scm.com/download/win , bạn có thể gặp sự cố với cài đặt cygwin (tùy thuộc vào tùy chọn bạn chọn). Cygwin ~ của tôi đã kết thúc tại thư mục người dùng Win7 của tôi và sshsẽ không hoạt động chính xác cho đến khi chỉnh sửa /etc/passwdnhư mô tả.
Allan

Các vấn đề mà @Allan đề cập ở đây với cài đặt git được giải quyết bằng cách đặt biến môi trường Windows cho HOME và sau đó tạo lại /etc/passwdtệp. Xem câu trả lời của tôi ở đây để tránh những vấn đề như vậy.
Christopher

11
db_home: /%Hcó thể giải quyết cho một tên người dùng miền (thay vì tên người dùng cục bộ), có thể không phải là những gì bạn muốn có. db_home: /cygdrive/c/Users/%Uđã làm những gì tôi muốn có.
Abdull

2
Tôi thấy sự khác biệt về hiệu suất giữa các phương pháp khác nhau. Khi tôi sử dụng db_home: windows, nó mất shkhoảng 2,5 đến 3,5 giây để khởi động. Khi tôi sử dụng db_home: /cygdrive/c/Users/%U, mất shkhoảng 0,9 đến 1,0 giây để khởi động. Khi tôi xóa db_homedòng hoặc mã cứng nó vào thư mục chính của Windows, shmất khoảng 0,2 đến 0,3 giây để bắt đầu. Tôi đang db_home: /cygdrive/c/Users/susamsử dụng giải pháp mã hóa cứng, ví dụ: vì tôi thường chạy các tập lệnh shell từ Command Prompt bằng cách sử dụng shlệnh, ví dụ: sh foo.shvà sẽ trở nên bất tiện khi phải đợi hơn 2 giây.
Susam Pal

1
Cảm ơn bạn @abdull, db_home: / cygdrive / c / Users /% U là câu trả lời tôi cần. db_home: windows sử dụng "/ home /% U", không tồn tại trên cấu hình của tôi.
Jeff

74

Cygwin 1.7.34+

Đối với những người sử dụng Cygwin 1.7.34 trở lên, Cygwin hỗ trợ cấu hình cách tìm nạp thư mục chính, trình bao đăng nhập và thông tin gecos trong /etc/nsswitch.conf. Điều này được trình bày chi tiết trong phần Hướng dẫn sử dụng Cygwin:

Nếu trước đây bạn đã tạo một /etc/passwdhoặc /etc/grouptệp, bạn sẽ muốn xóa chúng và định cấu hình Cygwin bằng cách sử dụng mô hình Bảo mật Windows mới cho ánh xạ POSIX.

[[ -f /etc/passwd ]] && mv /etc/passwd /etc/passwd.bak
[[ -f /etc/group ]] && mv /etc/group /etc/group.bak

Các /etc/nsswitch.conftập tin của db_home:thiết định nghĩa như thế nào Cygwin lấy về thư mục home của người dùng. Cài đặt mặc định cho db_home:

db_home: /home/%U

Vì vậy, theo mặc định, Cygwin chỉ đặt dir nhà thành /home/$USERNAME. Tuy nhiên, bạn có thể thay đổi điều đó để trỏ đến bất kỳ đường dẫn tùy chỉnh nào khác mà bạn muốn. Các ký tự đại diện được hỗ trợ là:

  • %u Tên người dùng Cygwin (đó là u viết thường).
  • %U Tên người dùng Windows (đó là chữ hoa U).
  • %D Miền Windows theo kiểu NetBIOS.
  • %HThư mục chính của Windows theo kiểu POSIX. Lưu ý rằng, đối với db_home:cài đặt này, điều này chỉ có ý nghĩa ngay sau dấu gạch chéo trước đó, như trongdb_home: /%H/cygwin
  • %_Vì dấu cách và các ký tự TAB được sử dụng để phân tách schemata, một khoảng trắng trong tên tệp phải được cung cấp dưới dạng %_(đó là dấu gạch dưới).
  • %% Một ký tự phần trăm.

Thay cho một đường dẫn, bạn có thể chỉ định một trong bốn schemata đường dẫn được đặt tên đã được xác định trước.

  1. windowsThư mục chính của người dùng được đặt thành cùng một thư mục được sử dụng làm thư mục chính của Windows, thường là thư mục dọc theo dòng %USERPROFILE%hoặc C:\Users\$USERNAME. Tất nhiên, thư mục Windows được Cygwin chuyển đổi sang kiểu POSIX.

  2. cygwinChỉ AD: Thư mục chính của người dùng được đặt thành đường dẫn POSIX được đưa ra trong thuộc tính cygwinHome từ lớp bổ trợ cygwinUser. Xem thêm phần có tên “Giản đồ cygwin” .

  3. unixChỉ AD: Thư mục chính của người dùng được đặt thành đường dẫn POSIX được cung cấp trong thuộc tính unixHomeDirectory từ lớp bổ trợ posixAccount. Xem thêm phần có tên “Giản đồ unix” .

  4. descThư mục chính của người dùng được đặt thành đường dẫn POSIX được đưa ra trong cài đặt giống XML home = "..." trong thuộc tính mô tả của người dùng trong SAM hoặc AD. Xem phần có tên “Giản đồ mô tả” để biết mô tả chi tiết.

Phần sau sẽ làm cho thư mục chính của người dùng trong Cygwin giống như được sử dụng cho thư mục chính của Windows.

db_home: windows

Cygwin 1.7.33 trở xuống

Đối với những người sử dụng Cygwin 1.7.33 hoặc phiên bản cũ hơn, hãy cập nhật lên phiên bản Cygwin mới nhất và xóa các tệp /etc/passwd/etc/grouptệp đã sử dụng trước đó , sau đó xem các bước ở trên.

Nếu không, hãy làm theo các bước cũ hơn bên dưới.

Đầu tiên, đặt một biến môi trường Windows cho HOME trỏ đến hồ sơ người dùng của bạn:

  1. Mở hệ thống trên bảng điều khiển
  2. Trên tab Nâng cao, bấm vào Biến Môi trường (về phía dưới cùng)
  3. Trong vùng Biến người dùng, hãy nhấp vào "Mới…"
  4. Đối với tên biến, hãy nhập HOME
  5. Đối với giá trị biến, hãy nhập %USERPROFILE%
  6. Nhấp vào OK trong tất cả các hộp thoại đang mở để áp dụng cài đặt mới này

Bây giờ chúng ta sẽ cập nhật /etc/passwdtệp Cygwin với %HOME%biến Windows mà chúng ta vừa tạo. Đăng nhập Shell và đăng nhập từ xa thông qua sshsẽ dựa vào đó /etc/passwdđể cho họ biết vị trí $HOMEđường dẫn của người dùng .

Tại dấu nhắc lệnh Cygwin bash, gõ như sau:

cp /etc/passwd /etc/passwd.bak
mkpasswd -l -p $(cygpath -H)  > /etc/passwd 
mkpasswd -d -p $(cygpath -H)  >> /etc/passwd 

Công -dtắc yêu cầu mkpasswd bao gồm người dùng DOMAIN, trong khi -lchỉ xuất người dùng máy LOCAL. Điều này rất quan trọng nếu bạn đang sử dụng PC tại nơi làm việc mà thông tin người dùng được lấy từ Bộ điều khiển miền của Windows.

Bây giờ, bạn cũng có thể làm điều tương tự cho các nhóm, mặc dù điều này là không cần thiết trừ khi bạn sử dụng máy tính là một phần của Miền Windows. Cygwin đọc thông tin nhóm từ cơ sở dữ liệu tài khoản Windows, nhưng bạn có thể thêm /etc/grouptệp nếu máy của bạn thường xuyên bị ngắt kết nối khỏi Bộ điều khiển miền của nó.

Tại dấu nhắc Cygwin bash, gõ như sau:

cp /etc/group /etc/group.bak
mkgroup -l > /etc/group 
mkgroup -d >> /etc/group 

Bây giờ, thoát khỏi Cygwin và khởi động lại. Bạn sẽ thấy rằng đường dẫn HOME của bạn trỏ đến cùng một vị trí với Hồ sơ người dùng Windows của bạn - tức là/cygdrive/c/Users/username


7
-d chậm thật. Nếu bạn chỉ cần người dùng hiện thời, bạn có thể sử dụng thay vì -c: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Bến Challenor

Ben đúng, bạn chỉ có thể thêm một mục nhập cho người dùng hiện tại bằng cách chỉ định -c thay thế. Tuy nhiên, nếu bạn làm như vậy, Cygwin sẽ hiển thị ????? cho Người dùng và Nhóm khi liệt kê tệp trên hệ thống tệp dùng chung, vì nó sẽ không có bản ghi cho người dùng và nhóm khác trên Miền hoặc máy tính cục bộ của bạn.
Christopher

1
Tôi có thể đề xuất một thay đổi nhỏ trong cách diễn đạt không: thay vì 'Bây giờ, hãy cập nhật tệp Cygwin / etc / passwd của bạn bằng một đường dẫn $ HOME mới', tôi sẽ đề xuất 'Bây giờ chúng ta sẽ cập nhật tệp Cygwin / etc / passwd với Biến HOME chúng tôi vừa tạo. ' Cảm ơn nhiều
Robert

Với -d Phải mất vài phút (tôi đã giết sau 5) phút để hoàn thành. Vì vậy, tôi đã chạy lại với -c. Tất cả tốt cho nhu cầu của tôi.
bartosz.r

1
@Samuel Tôi đã thêm phần giải thích để làm rõ mục đích của việc mkgrouptrên.
Christopher

30

Tôi đã làm một việc khá đơn giản. Tôi không muốn thay đổi biến môi trường windows 7. Vì vậy, tôi đã trực tiếp chỉnh sửa tệp Cygwin.bat.

@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL

Thao tác này chỉ bắt đầu trình bao cục bộ với thư mục chính này; đó là những gì tôi muốn. Tôi sẽ không truy cập từ xa cái này, vì vậy cái này phù hợp với tôi.


Thứ hai, điều này vì tôi không thể thay đổi biến môi trường gia đình trong máy phát triển của mình.
Deqing

@WernerCD Tôi chỉ xin lưu ý rằng điều này có thể gây ra hậu quả không mong muốn khi tương tác với các ứng dụng Windows gốc. Các ứng dụng Windows của bạn sẽ tiếp tục tìm TRANG CHỦ tại vị trí cũ. Một ví dụ sẽ là Gvim, sẽ duy trì một cấu hình vim riêng biệt tại %HOME%vị trí Windows cũ , trong khi Cygwin vim sử dụng $HOMEđường dẫn mới mà bạn đã khai báo.
Christopher

Điều này thật tuyệt vời ... 5 năm sau và tôi thích nó vì "kỹ thuật" đủ đơn giản để một người mới tương đối với Cygwin (như tôi) có thể sử dụng và hiểu được. Tình cờ, đặt một lối tắt đến tệp .bat của bạn trong C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo có nghĩa là bạn có thể đi tới Gửi -> Cygwin trên menu phân biệt ngữ cảnh (nhấp chuột phải) trong Explorer (và mở một thiết bị đầu cuối ở bất kỳ đâu, với ~ / đặt ở bất kỳ đâu bạn muốn).
mike Rodent

19

Cygwin mounthiện hỗ trợ phương thức ràng buộc cho phép bạn gắn kết một thư mục. Do đó, bạn chỉ cần thêm dòng sau vào /etc/fstab, sau đó khởi động lại trình bao của mình:

c:/Users /home none bind 0 0

Ngày nay đây là cách chính xác. Các câu trả lời khác đã lỗi thời.
ngừng

@ceving Điều này có được ghi lại ở đâu không?
Asad Saeeduddin

10

Thay đổi biến môi trường HOME của bạn.

trên XP, nhấp chuột phải vào Máy tính của tôi >> Thuộc tính >> Nâng cao >> Biến môi trường >> Biến người dùng cho >> [chọn biến HOME] >> chỉnh sửa


1
Điều này cũng sẽ thay đổi biến môi trường HOME của bạn cho tất cả các ứng dụng Windows của bạn.
mob

Rất đúng. Nhưng bạn có những ứng dụng Windows nào sử dụng biến HOME? Tôi có EmacsW32 và .... Cygwin. Vì tôi đã cài đặt Emacs trước, nên đó cũng là nơi trang chủ cygwin của tôi nằm.
Michael Paulukonis 29/09/09

1
Điều này sẽ không xung đột với / etc / passwd bằng cách nào đó? Nó sẽ mặc định là HOME của / etc / passwd nếu biến môi trường không được đặt? Nếu không có xung đột và nó sẽ mặc định thành / etc / passwd, có vẻ như thiết lập hoàn hảo: Tôi đang chạy Cygwin trên một ổ đĩa thu nhỏ, cả hai đều để tránh phải yêu cầu quyền cài đặt tại nơi làm việc và vì vậy tôi có Unix- như môi trường trong túi mà tôi có thể sử dụng khi chỉ có hộp Windows. Tại nơi làm việc, tôi sẽ có thư mục chính của máy tính làm việc và ở những nơi khác, tôi có thể có thư mục chính trên ổ đĩa nhỏ.
iconoclast

6

Tôi muốn thêm sửa đổi / cập nhật một chút về ưu tiên $ HOME. Thư mục chính trong / etc / passwd được ưu tiên hơn mọi thứ.

Tôi là người dùng Cygwin lâu năm và tôi vừa mới cài đặt xong Windows 7 x64 và Cygwin V1.126. Tôi đang phát điên khi cố gắng tìm ra lý do tại sao mỗi lần tôi chạy ssh, tôi liên tục nhận được:

e:\>ssh foo.bar.com
Could not create directory '/home/dhaynes/.ssh'.
The authenticity of host 'foo.bar.com (10.66.19.19)' can't be established.
...

Tôi thêm định nghĩa HOME = c: \ users \ dhaynes trong môi trường Windows nhưng nó vẫn tiếp tục cố gắng tạo '/ home / dhaynes'. Tôi đã thử mọi cách kết hợp có thể kể cả đặt HOME thành / cygdrive / c / users / dhaynes. Googled cho thông báo lỗi, không thể tìm thấy bất cứ điều gì, không thể tìm thấy bất cứ điều gì trên trang web cygwin. Tôi sử dụng cygwin từ cmd.exe, không phải bash.exe nhưng sự cố đã xuất hiện ở cả hai.

Cuối cùng tôi nhận ra rằng thư mục chính trong / etc / passwd được ưu tiên hơn so với biến môi trường $ HOME. Tôi đơn giản chạy lại 'mkpasswd -l> / etc / passwd' và cập nhật thư mục chính, bây giờ tất cả đều ổn với ssh.

Điều đó có thể hiển nhiên đối với các loại linux có trải nghiệm sysadmin nhưng đối với chúng ta, những người chủ yếu sử dụng Windows thì điều đó hơi khó hiểu.


1
Thư mục chính trong / etc / passwd KHÔNG được ưu tiên hơn mọi thứ. Tuy nhiên, nó được sử dụng làm nguồn chính cho đường dẫn thư mục HOME của bạn khi đăng nhập từ xa hoặc sử dụng ssh. Xem điều này từ Câu hỏi thường gặp về Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher

2

Tôi tình cờ sử dụng cwRsync (Cygwin + Rsync cho Windows) trong đó cygwin đi kèm và tôi không thể tìm thấy / etc / passwd.

Và nó tiếp tục nói

Could not create directory '/home/username/.ssh'.
...
Failed to add the host to the list of known hosts (/home/username/.ssh/known_hosts).

Vì vậy, tôi đã viết một tệp lô thay đổi biến HOME trước khi chạy rsync. Cái gì đó như:

set HOME=.
rsync /path1 user@host:/path2

Và viola! Thư mục .ssh xuất hiện trong dir đang hoạt động hiện tại và rsync đã ngừng gây phiền nhiễu với dấu vân tay rsa.

Đây là một bản sửa lỗi nhanh, nhưng sau này bạn nên thay đổi HOME thành một vị trí an toàn hơ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.