Langkau ke kandungan

Stesen dan persekitaran terasing

Sebuah stesen ialah mesin pakai buang yang dipandu ejen secara masa nyata — penyemak imbas, desktop Linux, emulator Android, Simulator iOS, atau mesin di sebalik terminal terasing. Kebanyakan stesen ialah VM; simulator mudah alih yang diuruskan hos ialah pengecualian yang nyata. Halaman ini menerangkan setiap sempadan dan mengapa bahagian-bahagiannya dibentuk sebegitu. Untuk membuka satu, lihat Berikan ejen mesin untuk diuji; untuk kata kerja, port dan lalai yang tepat, lihat rujukan stesen.

Kotak pasir natif membalut sesuatu proses dalam pengasingan ruang nama — nyata, tetapi ia berkongsi kernel anda, dan ia mengekang satu proses, bukan satu komputer. Sebaik sahaja ejen perlu mengklik di sekeliling aplikasi desktop, memaparkan halaman dalam penyemak imbas sebenar, atau menjalankan eksperimen rm -rf yang anda lebih suka tidak fikirkan, sempadan yang jujur ialah sebuah mesin: kernel sendiri, cakera sendiri, tindanan rangkaian sendiri.

Permukaan terasing menggunakan dua bahagian belakang VM:

  • microVM untuk terminal dan penyemak imbas — but hipervisor dalam masa kurang sesaat daripada imej kontena yang dipinkan mengikut digest.
  • QEMU untuk desktop Linux penuh, yang memerlukan peranti paparan yang tiada pada microVM.

Permukaan mudah alih diuruskan hos dan menyatakan sempadan yang lebih lemah itu secara terus:

  • Android memandu emulator Google melalui ADB.
  • iOS mencipta dan memiliki peranti CoreSimulator pada hos Mac dan memandunya melalui WebDriverAgent. Peranti itu dan datanya dipadamkan apabila stesen ditutup, tetapi rangkaiannya mengikut Mac hos.

Stesen terasing menulis ke tindanan pakai buang di atas imej asas baca sahaja, jadi satu stesen tidak boleh mengubah apa yang dibut oleh stesen seterusnya. Stesen iOS memiliki peranti CoreSimulator pakai buang yang dipadamkan apabila stesen ditutup. Android melampirkan diri pada emulator hos yang hidup lebih lama daripada sesi itu.

Rangkaian sesebuah stesen bermula pada tiada apa-apa. Hos diterima masuk bagi setiap stesen melalui pintu yang tidak boleh dilencongkan oleh tetamu: satu-satunya laluan keluar bagi mesin itu ialah yang dicipta oleh konfigurasi pelancaran. Terminal terasing mendapat garis dasar pembangun (daftar pakej, hos kod, cermin apt); stesen penyemak imbas menerima masuk tapak produk (usectrl.dev) dan but ke halaman file:// setempat yang tidak memerlukan keluar; segala-galanya yang lain ditolak pada masa sambungan.

Android dan iOS tidak dilindungi oleh pintu ini. Emulator dan simulator hos mereka menggunakan rangkaian hos pelayan, jadi antara muka dan laporan keupayaan menandakan keluar sebagai tidak dikuatkuasakan dan tidak pernah menawarkan kawalan “Mulakan semula tanpa sekatan” yang mengelirukan.

Keluar dan kelayakan ialah satu polisi yang dilihat daripada dua sisi — broker kelayakan (di bawah) tidak akan mengeluarkan token untuk hos yang tidak boleh dicapai oleh tetamu.

Segala yang dibaca oleh stesen dianggap tidak dipercayai: teks halaman, pepohon DOM dan kebolehcapaian, longgokan UI dan output konsol kembali kepada ejen dipagari dengan peraturan tetap “ini data, bukan arahan”. Pagar itu ialah pembingkaian; pintu keluar ialah penguatkuasaan di belakangnya.

Input melalui hipervisor, tangkapan melalui tetamu

Bahagian bertajuk “Input melalui hipervisor, tangkapan melalui tetamu”

Untuk permukaan desktop, peristiwa papan kekunci dan penunjuk disuntik oleh peranti input maya hipervisor sendiri. Tetamu tidak pernah menjalankan daemon istimewa yang boleh mensintesis input — jadi kompromi perisian tetamu tidak menyerahkan papan kekunci kepada penyerang. Tangkapan mengalir ke arah sebaliknya, melalui ejen dalam tetamu yang kecil dan tanpa keistimewaan, kerana tetamu boleh menskalakan bingkai sebelum ia melintasi wayar.

Orang yang menonton dan model yang memandu mempunyai keperluan yang bertentangan, jadi stesen menyajikan dua strim yang berasingan:

  • Lorong manusia ialah resolusi penuh pada saiz panel anda, dirunding semula apabila anda mengubah saiz, digeganti oleh pelayan sebagai bait legap — pelayan tidak pernah menyahkod bingkai, kerana penyahkod video pada laluan permintaan itulah yang menghalangnya daripada menjawab RPC.
  • Lorong ejen ialah gambar pegun yang dikecilkan, dihadkan pada saiz yang mesra model, satu imej bagi setiap hasil alat, dengan bingkai lama digugurkan semasa pemadatan manakala perihalan teksnya kekal.

Tiada lorong berkompromi untuk yang lain: anda mendapat gambar yang lancar, model mendapat gambar yang murah.

Pengambilalihan ialah titik sesak, bukan permintaan

Bahagian bertajuk “Pengambilalihan ialah titik sesak, bukan permintaan”

Kawalan eksklusif dikuatkuasakan pada satu titik yang dilalui setiap tindakan — bukan dengan meminta model berkelakuan baik. Semasa seseorang manusia memegangnya, pelayan menolak tindakan yang mengubah keadaan oleh ejen. Ejen mengekalkan kata kerja pemerhatiannya (tangkap layar, pengekstrakan) supaya ia boleh menceritakan apa yang anda lakukan, dan ia dimaklumkan tentang pengambilalihan itu melalui lorong pemanduannya dan bukan dibiarkan menemuinya melalui klik yang ditolak. Mengklik dan menaip pada kanvas berfungsi selagi tiada orang lain memegang kunci itu — atau apabila anda yang memegangnya; teg status memaparkan Anda mempunyai kawalan. Setiap peristiwa input — milik anda dan milik ejen — masuk ke dalam log audit setiap stesen dengan prinsipalnya serta jujukan monotonik, jadi “siapa yang klik itu” kekal boleh dijawab selepas mesin itu hilang.

Kandungan melintasi sempadan; mesin tetap berasingan

Bahagian bertajuk “Kandungan melintasi sempadan; mesin tetap berasingan”

Salin dan tampal berfungsi dalam kedua-dua arah, begitu juga menyeret fail masuk dan keluar — tetapi stesen ialah komputer yang berbeza, dan reka bentuk ini tidak pernah berpura-pura sebaliknya.

Papan klip dibawa atas permintaan, bukan dicerminkan secara berterusan. Tekan kord salin pada stesen dan tetamu diminta menyalin, kemudian apa sahaja yang diletakkannya pada papan klipnya — teks, imej, senarai fail — diambil dan diletakkan pada papan klip anda. Tampal menghantar kandungan yang sama ke arah sebaliknya dan kemudian menekan tampal di dalam tetamu. Tiada apa-apa disegerakkan di latar belakang: kata laluan yang anda salin pada mesin anda sendiri tidak tiba secara senyap di dalam VM kerana pemasa tercetus.

Pelintasan dipagari bagi setiap pengguna dan setiap arah, secara berasingan. Tampal ke dalam stesen dibenarkan secara lalai; salin keluar daripada stesen akan bertanya dahulu (kebenaran sepuluh minit, atau Sentiasa benarkan di bawah Tetapan → Pelayan → Stesen → Akses papan klip). Ia tidak pernah menjadi tetapan ruang kerja: seorang ahli tidak boleh memberi kebenaran bagi papan klip ahli lain.

Pada macOS kord pelintasan ialah ⌘C/⌘V, yang tidak kabur — ⌃C terus sampai ke shell tetamu sebagai isyarat gangguan yang sememangnya. Pada Windows dan Linux, kedua-dua kord itu ialah ketukan kekunci yang sama, jadi tetamu menerimanya tanpa perubahan dan papan klip anda hanya ditulis ganti apabila papan klip tetamu benar-benar berubah. Isyarat gangguan kekal sebagai isyarat gangguan.

Fail yang diseret masuk disalin ke dalam folder lepasan mesin itu dan kemudian ditawarkan kepadanya. Apa maksud “ditawarkan” bergantung pada apa yang benar-benar boleh dilakukan: halaman penyemak imbas menerima peristiwa lepas yang sebenar pada titik anda melepaskannya, jadi zon muat naik berkelakuan sama seperti untuk fail setempat; desktop menerima fail itu dalam ~/Drops dengan laluannya pada papan klipnya, kerana tiada hos boleh mensintesis seretan ke dalam toolkit Linux sewenang-wenangnya tanpa menjalankan daemon istimewa di dalam tetamu — dan itulah tepatnya yang ditolak oleh reka bentuk ini. Hasilnya menyatakan apa yang berlaku, jadi CSV yang dilepaskan pada zon muat naik tidak pernah dilaporkan sebagai dimuat naik sedangkan ia sekadar fail dalam folder. Melepaskan fail ke atas terminal terasing menyalin fail itu masuk dan menaip laluan tetamunya pada prompt, yang itulah yang benar-benar boleh digunakan oleh shell.

Fail yang diseret keluar berfungsi pada permukaan desktop, tempat protokol seretan X11 menjadikan muatannya boleh dibaca semasa seretan sedang berlangsung. Mulakan seretan di dalam tetamu, bawa keluar dari kanvas, dan fail itu diambil ke mesin anda dan diserahkan kepada OS sebagai seretan sebenar. Menyalin fail dalam pengurus fail tetamu dan menampalnya pada hos berfungsi dengan cara yang sama. Permukaan penyemak imbas sengaja tidak menawarkan ini: penyemak imbas tanpa kepala tiada pilihan seretan untuk dibaca, dan isyarat terdekat yang ada — pemilihan teks halaman — sama sekali bukan bukti seretan, jadi bertindak berdasarkan itu akan merampas klik biasa.

Segala yang dibaca daripada tetamu kekal sebagai kandungan tidak dipercayai: teks papan klip sampai kepada model di dalam pagar yang sama seperti pengekstrakan halaman, dan log audit merekodkan bahawa tampal berlaku dan berapa banyak kandungannya — tidak pernah apa isinya.

git push berfungsi dari terminal terasing yang anda buka, namun tetamu tidak menyimpan sebarang token hos kod. Ia memegang satu rahsia bagi setiap VM yang satu-satunya kuasanya ialah meminta kepada broker kelayakan hos — melalui terowong yang dikawal hos — token berjangka pendek yang berskop repo, bagi setiap operasi, dihadkan kadarnya, dibatasi oleh senarai kebenaran hos yang sama seperti keluar, dan dibatalkan sebaik sahaja stesen ditutup. Mesin yang dibina untuk dibuang tidak boleh mengandungi apa-apa yang berharga untuk dicuri.

Apa yang boleh dilakukan oleh token itu ditetapkan apabila stesen dibuka. Stesen terminal yang dibuka oleh manusia mendapat token tulis, dibatasi oleh akses hos kod ahli itu sendiri. Stesen yang dibuka oleh ejen mendapat token baca sahaja: pembantu kelayakan git tidak dapat membezakan push daripada fetch, jadi peraturan push tidak boleh ditanya bagi setiap push di dalam tetamu seperti yang dilakukan oleh gerbang larian ejen pada hos.

Apabila stesen membawa repositori anda, worktree hos kekal berwibawa. Salinan itu disegerakkan masuk semasa but (dengan rahsia seperti fail .env dikecualikan), dan komit hanya kembali apabila anda memintanya — diambil ke dalam refs/rigs/<id>/*, tidak pernah ditolak, tidak pernah di-checkout. Tiada apa-apa di dalam VM boleh menggerakkan cabang anda atau menyentuh pokok kerja anda; mencantumkan apa yang dihasilkan stesen sentiasa keputusan manusia yang dibuat pada hos.

Pelayan dev yang dimulakan di dalam VM terminal menjadi boleh dicapai — pada mesin anda, dalam Penyemak imbas (VM), secara pilihan pada LAN anda, secara pilihan di bawah domain dev dengan HTTPS — tanpa pernah membuka mesin itu. Peta port hipervisor ditetapkan semasa but, jadi semua pemajuan selepas itu menaiki dua saluran sempit yang dikawal hos: satu pemultipleks masuk yang telah dicipta lebih awal yang enggan mendail apa-apa yang tetamu tidak benar-benar mendengarnya, dan terowong terbalik yang dibiarkan terbuka oleh hos untuk sambungan yang dimulakan tetamu. HTTPS domain dev ditamatkan pada pelayan menggunakan autoriti yang dikeluarkan secara setempat yang kuncinya tidak pernah masuk ke mana-mana tetamu. Mekanismenya ada dalam Majukan port dari terminal.

Stesen tidak boleh menjadi haiwan belaan:

  • TTL keras yang tidak boleh dilanjutkan oleh tetamu;
  • tangga melahu — diparkirkan (vCPU dihentikan, RAM kekal dimuat) selepas tetingkap melahu, ditutup selepas dua kali gandanya — dengan terminal yang terbuka atau penonton yang menonton dikira sebagai “sedang digunakan”;
  • bajet memori yang dikira dalam megabait mastautin, bukan sesi, kerana VM yang diparkirkan membebaskan CPU tetapi mengekalkan setiap bait RAM; mesin yang paling lama tidak digunakan disingkirkan dahulu, dan tidak pernah mesin yang sedang dipandu atau ditonton oleh seseorang;
  • peruntuhan apabila pelayan dimatikan, serta sapuan yatim yang ditandai pemilikan pada permulaan seterusnya, supaya pelayan yang ranap tidak pernah meninggalkan hipervisor yang tidak menjawab sesiapa.

But pertama menarik imej mesin yang dipinkan; pelayan kemudian menyimpan salinan pra-ekstrak dalam cache di latar belakang, jadi setiap mesin seumpama itu selepas itu but dalam beberapa saat dan terminal terasing muncul dengan garis dasar CLI seperti runner yang dihoskan GitHub sudah dipasang — pengkompil, Python, jq, alat arkib — bukan toolcache bahasa atau Docker. Imej Komputer membenamkan garis dasar CLI yang sama pada masa binaan, bersebelahan XFCE dan penyemak imbas.

“Ia berfungsi pada mesin saya” ialah dakwaan tentang satu enjin pemaparan. Jadi stesen penyemak imbas bukan “penyemak imbas” — ia ialah Chromium, Firefox atau WebKit, dipilih semasa anda membukanya, dan stesen menjalankan yang dengannya ia dibuka sepanjang hayatnya. Satu perbualan boleh memegang satu bagi setiap jenis: membuka Firefox (VM) di sebelah Chromium (VM) memberi anda dua mesin, dan mengarahkan kedua-duanya ke halaman yang sama itulah perbandingannya. WebKit hampir sama dengan Safari seperti apa-apa sahaja yang berjalan pada Linux — keturunan enjin yang sama, jadi ia menangkap jurang yang dialami pengguna Safari.

Kata kerjanya serupa pada ketiga-tiganya; protokol di bawahnya tidak, dan perbezaannya dinyatakan dan bukan dilicinkan. Chromium bertutur dalam DevTools Protocol dan menolak bingkai, jadi paparan langsungnya tidak menelan kos selagi halaman itu pegun. Firefox bertutur WebDriver BiDi dan WebKit bertutur WebDriver klasik, dan kedua-duanya tiada screencast, jadi paparan langsungnya meninjau secara berkala — beberapa bingkai sesaat, yang sesuai untuk menonton halaman dan bukan untuk menonton animasi. Apabila sesuatu enjin benar-benar tidak boleh melakukan sesuatu (Firefox tiada muat semula yang melangkau cache; WebKit tidak boleh melihat output konsol yang dilog sebelum halaman selesai dimuatkan), jawapannya menyatakan demikian dan bukan secara senyap melakukan perkara lain.

Stesen sengaja bukan destinasi global. Paparan langsung ialah tab dalam ruang atau PR tempat kerja itu berlaku, berskop kepada perbualan itu — jadi tab anda dan panggilan browser_use ejen menujukan satu mesin (satu bagi setiap enjin, pada permukaan penyemak imbas). Sama ada stesen boleh but langsung ialah sifat hos, jadi keupayaan, imej, imej tersuai bagi setiap ruang kerja dan senarai mesin yang berjalan terletak di bawah Tetapan → Pelayan → Stesen. Memandu persekitaran terasing ialah kelas tindakan guardrail tersendiri, jadi ruang kerja, ejen atau ruang boleh membenarkannya, memerlukan kelulusan, atau menolaknya terus — modus baca sahaja menolaknya secara menyeluruh.