/ Depolama / öykünmüş / 0 / nedir?


39

Son zamanlarda, ben dosyaları silerseniz o anladım /sdcard/Downloado dosyaları siler /storage/emulated/0/Download. Ve eğer dosyaları eklersem içine /sdcard/Downloadkopyalar /storage/emulated/0/Download.

Yani nedir /storage/emulated/0/? Android dosya sistemimizde hangi amaçlar var?

Yanıtlar:


40

/storage/emulated/0/Download dosyaların asıl yoludur.

/sdcard/Download gerçek yoluna bir bağlantı /storage/emulated/0/Download

Ancak, asıl dosyalar /data/media, daha sonra bağlandığı /storage/emulated/0(ve çoğu zaman diğer bağlama noktalarına) içinde bulunduğu dosya sisteminde bulunur.

Bir Symlink Hesaplamada, sembolik bir bağ, mutlak veya göreceli bir yol biçiminde başka bir dosyaya veya dizine başvuru içeren ve yol adı çözünürlüğünü etkileyen herhangi bir dosya için kullanılan terimdir. 1978'de DEC ve Data General RDOS firmasının mini bilgisayar işletim sistemlerinde sembolik bağlar vardı.


15
Bu cevap, neden “öykündüğünü” biraz açıklarsa daha iyi olurdu. Android'in aslında daha iyi bir şey tarafından desteklenen FAT'leri taklit etmek için bazı kesimler yaptığına inanıyorum, ancak yeni bir şey öğrenmek umuduyla ayrıntıları bilmiyorum ve bu soruyu tıkladım.
R.

4
@R .. "öykünmüş" IMHO, "taklit edilmiş bir SD kart" olduğu gerçeğine işaret ediyor (gerçek değil).
Izzy

10
@R .. SDCardFS kullanır. İşte bu konuda mükemmel bir makale: xda-developers.com/… ( arşiv )
Nonny Moose

16

/storage/emulated/0/aslında /data/media/0/öykünmüş / sanal bir dosya sistemi aracılığıyla ortaya çıkar, gerçek değil.

Bu benim önceki cevap atfen olduğunu burada ama daha ilgili ayrıntılarla birlikte.

ANDROID DEPOLAMA

On Android 5 :

/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media

Açık 6+ Android :

# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media

# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media

* >S>sembolik bağlantı için, >E>öykünmüş ve >B>bağlanma için
* USER-IDmevcut durumda Multiple Usersveya bu durumda Work Profilenormalde 0yani cihaz sahibinin bağlanması için
* VIEWbunlardan biridir read(izinli uygulamalar için. READ_EXTERNAL_STORAGE) veya write(izin default. WRITE_EXTERNAL_STORAGE) / global mount ad alanı, yani zygote dışında)
* Önceki Android sürümlerinde küçük farklılıklar vardı, ancak öykünme kavramı uygulandığından beri aynıydı.
* Android'in takma ad alanı uygulamasıyla ilgili biraz daha ayrıntılı bilgi için, bu cevaba bakın .

Kısacası /sdcardve /storage/emulated/0- bir FAT / vFAT / FAT32 dosya sistemini temsil eden - üzerinden veya öykünme yoluyla /data/media/0(veya Kabul Edilebilir Depolama/mnt/expand/[UUID]/media/0 durumunda) gelin . FUSEsdcardfs

Android'e özgü olmamakla birlikte, genellikle Linux ile ilişkili, sembolik bağlantı ve bağlanma bağlaması (bkz. "Bağlama bağlaması oluşturma"), soru temel olarak öykünme kısmıyla ilgili olduğu için bu sorunun kapsamı dışındadır.

EMÜLASYON:

Öykünme neden burada? Öykünülmüş dosya sistemi, temelde iki amaca hizmet eden gerçek dosya sistemindeki ( ext4veya f2fs) bir soyutlama katmanıdır :

  • Android cihazların PC'lere USB bağlantısını koruyun (günümüzde MTP aracılığıyla uygulanmaktadır)
  • Uygulamalara / işlemlere, kullanıcının özel ortamına ve diğer uygulamaların SD kartındaki verilere yetkisiz erişimini kısıtlayın.

Detaylar için Android'in Depolama Yolculuğunu okuyun , özet:

Erken Android aygıtlar dahili depolamada yetersiz kaldı ve bilgisayarların çoğuyla uyumluluk sağlamak için geleneksel olarak FAT dosya sistemi kullanan (fiziksel olarak) harici SD kartlara güveniyordu (Microsoft'un PC dünyasında baskın olduğuna bakın).
Dahili depolama boyutu büyüdüğünde, aynı dosya sistemi dahili (hala "harici" olarak adlandırılan) SD kartına kaydırıldı.
Ancak FAT / vFAT uygulamasının Google tarafından kademeli olarak ele alındığı iki ana sorunu vardı:

  • Bugünlerde bir USB sürücüyü bağladığımız gibi Android aygıtları doğrudan PC'lere ( USB Yığın Depolama ) bağlandı. UMS, cihazı blok düzeyinde ortaya çıkarır ve SD kartı Android çerçevesinden ayırır (takmadan çıkar), böylece tüm veriler uygulamalarda kullanılamaz duruma gelir ve muhtemelen birçok işlevi bozabilir.
  • FAT (Windows'un geliştirme günlerinde favori olduğu), UNIX izinlerini (mod, uid, gid ve benzer şekilde sembolik bağlantılar ve ioctlsbenzeri FS_IOC_FIEMAP) uygulamak için asla tasarlanmamıştır . Bu nedenle, SD karttaki tüm veriler (her Android uygulaması bir UNIX / Linux kullanıcısı olduğu ve bir kullanıcı kullanıcısı olduğu için) herhangi bir kısıtlamaya sahip olmadığından, ciddi gizlilik ve güvenlik endişeleri doğurduğundan tüm uygulamalara açıktı.

Bu sorunların her ikisi de öykünme yoluyla ele alındı:

  • Gerçek SD kart depolama, UNIX izinlerini tamamen uygulayan dosya sistemini (yavaş yavaş değiştirilerek /data) içeren bölüme (veya daha önce bazı cihazlarda bağımsız / sdcard bölümüne) taşındı . ext4f2fs
  • Bu /databölüm UMS imkansız hale getirildi, çünkü bütün bölümler PC'ye 2 nedenden ötürü maruz bırakılamadı: (1)birçok kullanıcı ve diğer uygulamalardan ve kullanıcılardan korunacak birçok veri içeriyor. (2)Linux dosya sistemleri Windows tarafından desteklenmemektedir.
    Bu yüzden UMS, önceden kurulmuş bir protokol olan PTP'ye istemci-sunucu tipi bir uzantı olan Medya Aktarım Protokolü ile değiştirildi. MTP , blok aygıtı göstermiyor, ancak yazılım yığını üzerinden çalışıyor. MTP sunucusu, Android'de android.process.media, Android çerçevesinde tam olarak sanallaştırılmış bir uygulama olarak çalışır ( yükseltilmiş görevler yapamaz).

Artık uygulamalar (ve aynı zamanda bir uygulama olan MTP) /data/media, aynı anda her iki amaca ulaşmak, yani altındaki izin kontrollerini zorlamak ve üst yüzeydeki FAT dosya sistemi gibi görünmek yerine, öykünmüş depolama alanıyla etkileşime giriyor .

Google şimdi aracılığıyla öykünme uyguluyor sdcardfs eksikliklerin üstesinden gelmek için FUSE ; bunlardan bir tanesi girdi / çıktı ek yüküdür, yani okuma / yazma hızlarını iyileştirir.

HARİCİ DEPOLAMA İZNİ: Harici depolamadaki Genel ve Özel dosyalar
kavramı bir örnek kullanarak gösterilebilir: Install Termux uygulamasını. Dizinler oluşturun ve . Dosyaları oluşturun ve . Aşağıdaki komutları yürütün:

/sdcard/Android/data/com.termux/test_dir/sdcard/test_dir
/sdcard/Android/data/com.termux/test_file/sdcard/Android/data/com.termux/test_file

without_storage_perm * WhatsApp'in kurulu olması veya başka bir uygulamanın özel klasörünü seçmeniz gerekir.

Şimdi Termux uygulamasını durdurun ve Depolama izni verin . Komutları tekrar yürütün:

with_storage_perm

Aynı dosya ve dizinlerin izinlerindeki farkı görün. Bu, aynı anda ele alınacak yüzlerce uygulama (kullanıcı) olduğunda, yerel bir Linux dosya sisteminde öykünme olmadan basit bir şekilde mümkün görünmüyor. Bu, aynı dosyanın asıl dosya sistemindeki orijinal izinlerinden bağımsız olarak aynı anda üç farklı izin grubuyla gösterilmesini sağlayan dosya sistemi öykünmesidir:

# touch /data/media/0/test_file

# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file

# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file

Ayrıca bkz . “U # _everybody” UID nedir?

İlgili:


2
+1. Sanırım MTP ile ilgili kısmı yanlış anladım. MTP, çalışmak için hedef aygıtta bir FAT dosya sistemi gerektiriyor mu? Olmazsa, Google, bir uygulamanın yalnızca paylaşılan depolama alanındaki verilere erişmesi için gereken izin denetimlerini de uygulayabildiğinden FUSE uygulaması için ext4 dosya sistemini kullanamaz mı?
Firelord

1
@ Öykünme tartışılırken ilk, MTP uygulamasına odaklanılmamıştır. Google, bazı Android ihtiyaçlarını karşılamak için MTP protokolünde değişiklikler yaptı ve muhtemelen bazı yerel Linux dosya sistemleri aracılığıyla uygulayabildiler. Fakat mesele şu FAT-like permission-less filesystemki, geriye dönük uyumluluk sağlamak için Android'in ilk günlerinde olan ve Android'in Harici Depolama konseptinin tasarımını karşılayan bir şeye ihtiyacımız var. Amacımı geliştirmek için bir düzenleme yaptım.
Irfan Latif
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.