हेडलेस Mac पर ऑटो-लॉगिन, और macOS 27 इसे क्यों छोड़ देता है
किराए के Mac को रीबूट अपने आप झेलना होता है। मशीन के सामने पासवर्ड टाइप करने के लिए कोई खड़ा नहीं है। ग्राहक का ब्राउज़र डेस्कटॉप ग्राफ़िकल लॉगिन सेशन से जुड़ता है, इसलिए मशीन को लॉग इन होकर ही लौटना होता है। Apple Silicon पर हेडलेस ऑटो-लॉगिन कुछ ख़ास बारीकियों का छोटा सा ढेर है, और उनमें से चार चुपचाप फ़ेल होती हैं। उनमें से एक macOS 27 में नई है। ये रहीं।
दो सेटिंग जो इसे चालू करती हैं
ऑटो-लॉगिन के दो हिस्से हैं। एक प्रेफ़रेंस जो यूज़र का नाम बताती है, और पासवर्ड, जो ऐसी जगह रखा हो जहाँ लॉगिन विंडो उसे पढ़ सके।
# who logs in automatically defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser runner # the password, XOR-obfuscated, in /etc/kcpassword # (padded to a multiple of 12 bytes, keyed with a fixed vector)
/etc/kcpassword एक तय key से छिपाया जाता है, एन्क्रिप्ट नहीं किया जाता। जो भी फ़ाइल पढ़ सके, वह पासवर्ड निकाल सकता है। यह सिर्फ़ इसलिए स्वीकार्य है कि मशीन तक सिर्फ़ प्राइवेट नेटवर्क से पहुँचा जा सकता है, पब्लिक इंटरनेट से कभी नहीं। खुले पोर्ट वाली मशीन पर यह खुले में पड़ा एक credential होता।
चार चुपचाप रुकावटें
| जाँच | ठीक होने पर क्या दिखता है | खराब होने पर क्या दिखता है | नतीजा |
|---|---|---|---|
| FileVault चालू | डिस्क अनलॉक, macOS लॉग इन | pre-boot अनलॉक पर अटकी | बंद होना चाहिए |
| screen-lock-on-login फ़्लैग | सेशन अनलॉक होकर आता है | सेशन अनलॉक, स्क्रीन लॉक, काली | हटाना होगा |
| lastLoginPanic लैच | ऑटो-लॉगिन आगे बढ़ता है | ऑटो-लॉगिन छूटा, लॉगिन विंडो दिखी | हटाना होगा |
| /Library में LaunchAgent (macOS 27) | लॉगिन के बाद लोड | हर बूट पर panic लैच करता है | बाद में लोड करें |
FileVault
FileVault डिस्क एन्क्रिप्ट करता है, और macOS किसी को लॉग इन करे, उससे पहले डिस्क अनलॉक होनी चाहिए। कीबोर्ड वाली मशीन पर कोई इंसान अनलॉक टाइप करता है। हेडलेस मशीन पर टाइप करने वाला कोई नहीं, इसलिए जिस मशीन को आप छू नहीं सकते, उस पर ऑटो-लॉगिन और FileVault साथ नहीं चल सकते। हम FileVault बंद रखते हैं और सीमा के रूप में प्राइवेट नेटवर्क पर भरोसा करते हैं।
स्क्रीन-लॉक फ़्लैग
एक प्रेफ़रेंस है जो ऑटो-लॉगिन के बाद भी स्क्रीन फिर से लॉक कर देती है। यह उन मशीनों के लिए है जो डिस्प्ले स्लीप पर लॉक होती हैं। अगर यह सेट है, तो सेशन चालू होता है पर स्क्रीन लॉक रहती है। रिमोट से देखने वाले को यह काली दिखती है। ऑटो-लॉगिन चालू करते समय हम हमेशा autoLoginUserScreenLocked हटा देते हैं।
Panic लैच, जिसने हमारा एक दिन लिया
यह बारीक वाला है। जब लॉगिन सेशन फ़ेल होता है, तो macOS लॉगिन विंडो की प्रेफ़रेंस में lastLoginPanic दर्ज करता है। फिर वह जानबूझकर अगले बूट पर ऑटो-लॉगिन छोड़ता है और लॉगिन स्क्रीन दिखाता है। यह एक सुरक्षा फ़ीचर है, ताकि लॉगिन पर क्रैश होने वाली मशीन लूप में न फँसे।
अभी-अभी एनरोल हुए एक Mac पर पहला ही बूट Xcode की एक बड़ी कॉपी इंडेक्स करने में व्यस्त था, और load average 160 से ऊपर था। लॉगिन समय पर पूरा नहीं हुआ और लैच सेट हो गया। उसके बाद हर बूट ने ऑटो-लॉगिन छोड़ा, जबकि मशीन का कॉन्फ़िगरेशन पूरी तरह सही था।
sudo defaults delete /Library/Preferences/com.apple.loginwindow lastLoginPanic sudo shutdown -r now
शांत हो चुकी मशीन पर इसे हटाते ही ऑटो-लॉगिन तुरंत चल गया। पासवर्ड वही था, और सेटिंग भी वही जो शुरू से लगी थीं। हम इसे नई macOS रिलीज़ का बग बताकर लिखने ही वाले थे। उस बार यह बग नहीं था। सबूत एक कंट्रोल था: मशीन पर ज़्यादा लोड न रहने पर वही लक्षण चला गया, और असली कॉन्फ़िग कभी गलत नहीं था। वह कहानी बाकी कहानियों के साथ जो जाँचें कभी फ़ेल नहीं हो सकतीं में है।
macOS 27: हर बूट पर लैच
फिर हमने macOS 27 पर अपने पहले M6 mini एनरोल किए, और लैच लौट आया। इस बार मशीनें ख़ाली और शांत थीं। फिर भी हर रीबूट के बाद वे लॉगिन विंडो पर बैठी रहीं, और हर बार lastLoginPanic फिर से सेट होता रहा।
हमारी इमेज में /Library/LaunchAgents में एक LaunchAgent है। वह ग्राहक के सेशन में एक AI कोडिंग एजेंट चालू रखता है। उसके अंदर की स्क्रिप्ट पहले से ही डेस्कटॉप चालू न होने पर कुछ नहीं करती थी। इसलिए हमें शक फ़ाइल पर हुआ, स्क्रिप्ट पर नहीं।
जाँच एक कंट्रोल थी। हमने एक ही स्थिति वाली दो एक जैसी M6 यूनिट लीं। एक में plist थी, एक में नहीं। हमने उन्हें तीन सेकंड के अंतर पर रीबूट किया। बिना plist वाली लॉग इन हो गई। plist वाली panic में गई और लॉगिन विंडो पर रुक गई। जो यूनिट ठीक से लॉग इन हुई थी, उस पर plist वापस रखने से वह अगले बूट पर फिर अटक गई। यानी यह हर बूट पर होता है, सिर्फ़ पहले पर नहीं।
macOS 27 पर लॉगिन विंडो ऑटो-लॉगिन हैंडशेक के दौरान /Library/LaunchAgents से LaunchAgents लोड करती है। हमारी मशीनों पर लॉगिन फ़ेल करने और लैच सेट करने के लिए वह लोड काफ़ी था। key हटाने से मदद नहीं मिलती, क्योंकि अगला बूट उसे फिर सेट कर देता है।
# the fix: keep the plist out of the auto-load path sudo mv /Library/LaunchAgents/dev.example.agent.plist /opt/example/launchd/ # then load it into the user's session after login, from a root daemon launchctl bootstrap gui/$(id -u runner) /opt/example/launchd/dev.example.agent.plist
हमने plist को /Library/LaunchAgents से बाहर कर दिया। अब एक छोटा root LaunchDaemon यूज़र का सेशन बनने और Dock चलने का इंतज़ार करता है। फिर वह एजेंट को उस सेशन में लोड करता है। ऑटो-लॉगिन हर बूट पर चलता है, और एजेंट लगभग एक मिनट बाद शुरू होता है।
रास्ते में macOS 27 की दो और बारीकियों ने हमें परेशान किया। पहली, macOS 27 ऑटो-लॉगिन के कुछ सेकंड बाद स्क्रीन लॉक कर देता है। लॉक होने पर /dev/console का मालिक root होता है। इसलिए किसी के लॉग इन होने की जाँच के लिए इसे इस्तेमाल न करें। इसकी जगह यूज़र का gui/UID डोमेन और चलता हुआ Dock देखें। दूसरी, पहली बार चलने वाला Setup Assistant अब भी सेशन से जुड़ा रहता है। उसे बंद करने पर पूरा सेशन लॉगिन विंडो पर गिर जाता है और लैच फिर सेट हो जाता है। उसे उसकी प्रेफ़रेंस keys से दबाएँ, और कभी kill न करें।
काम करने वाला तरीका
सवाल
- macOS ऑटो-लॉगिन पासवर्ड कहाँ रखता है?
- /etc/kcpassword में, एक तय XOR key से छिपाकर, और साथ में loginwindow की प्रेफ़रेंस में autoLoginUser। यह छिपाना है, एन्क्रिप्शन नहीं। इसीलिए मशीन तक सिर्फ़ प्राइवेट नेटवर्क से पहुँचना चाहिए।
- क्या FileVault ऑटो-लॉगिन तोड़ देता है?
- हाँ। FileVault चालू होने पर डिस्क अनलॉक macOS के ऑटो-लॉगिन से पहले होता है। इसलिए हेडलेस मशीन अपने आप pre-boot स्क्रीन से आगे नहीं बढ़ सकती। ऑटो-लॉगिन के लिए FileVault बंद होना चाहिए।
- ऑटो-लॉगिन एक बार चला और फिर क्यों रुक गया?
- फ़ेल लॉगिन loginwindow की प्रेफ़रेंस में lastLoginPanic सेट कर देता है, और फिर macOS अगले बूट पर ऑटो-लॉगिन छोड़ देता है। वह key हटाएँ और शांत हो चुकी मशीन को रीबूट करें।
- macOS 26 पर चलने वाला ऑटो-लॉगिन macOS 27 पर क्यों फ़ेल होता है?
- macOS 27 पर /Library/LaunchAgents की LaunchAgent plist ऑटो-लॉगिन हैंडशेक के दौरान लोड होती है। हमारी मशीनों पर उस लोड ने हर बूट पर lastLoginPanic लैच कर दिया, और Mac लॉगिन विंडो पर रुक गया। plist को /Library/LaunchAgents से बाहर ले जाकर लॉगिन के बाद लोड करने से यह ठीक हुआ।
अपना हिसाब खुद लगाएँ: कैलकुलेटर देखें, या एक runner लीज़ करें।