English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Foreword
During development, we may need to modify the Android hosts file. The path to the Android hosts file is/system/etc/hosts,before modifying this file, you need to obtain root permissions on your Android phone. As for how to root your phone, this will not be elaborated here, and you can find many simple guides on the internet.
本文将要阐述的是如何在命令行下通过adb程序访问root过的手机,把hosts拖到电脑上修改,然后再复制回手机来实现修改hosts的方法。
下面就开始具体的步骤:
C:\tools>adb pull /system/etc/hosts hosts.mod [100%] /system/etc/hosts
上面的命令是把手机上的hosts文件拖到电脑上,[100%]表明文件已经传输完成,可以修改hosts文件了。在修改完成后就使用以下命令上传到手机:
C:\tools>adb push hosts.mod /system/etc/hosts adb: Fehler: Das Kopieren von 'hosts.mod' nach '' fehlgeschlagen/system/etc/hosts': Lesen-nur Dateisystem
从回显的消息可以看到,文件系统是只读的,所以不能直接上传。
试试以下的命令看能不能成功?!
C:\tools>adb root # 帮助文档说该命令可以让adbd守护进程获得root权限 C:\tools>adb push hosts.mod /system/etc/hosts adb: Fehler: Das Kopieren von 'hosts.mod' nach '' fehlgeschlagen/system/etc/hosts': Lesen-nur Dateisystem
还是不行,看来要重新挂载/system目录才可以。
C:\tools>adb remount remount failed: Operation not permitted
没有权限?这是必须祭起shell大法的节奏啊!
C:\tools>adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * shell@maguro:/ $ ls -al /system/etc/hosts -rw-r--r-- root root 25 2013-08-14 07:00 hosts
从上面最后一行可以看出hosts这个文件只有它的拥有者能写入,对于其他人来说都是只读的。要想让其他人也能做修改,必须使用以下命令进行提权,再改变hosts文件的属性才行。
shell@maguro:/ $ su
如果是第一次执行这个命令,手机会亮起,SuperSU应用会提示你是否同意权限的分配。这里当然是要同意的!接着你就可以看到终端下的提示符从$变成了#,@前的字符也由shell变成了root。然后我们就可以修改hosts文件的权限属性了。
root@maguro:/ # chmod +666 /system/etc/hosts Bad mode root@maguro:/ # chmod 666 /system/etc/hosts Unable to chmod /system/etc/hosts: Read-nur Dateisystem
又是Read-only file system!输入以下命令看看/system目录的文件系统详情呢。
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
看到ext4后面的ro了吗?它是read only的缩写,即只读的意思。这说明/system目录是只读的。接下来我们要把它改成可以读写。
root@maguro:/ # mount -o rw,remount /system
上面的-o用于指定加载文件系统时的选项。这些选项包括:
Noch einmal überprüfen, und man kann sehen, dass der Ort von ro zu rw geworden ist.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...
Aber bis hierhin können wir die hosts-Datei nicht auf das Telefon kopieren, weil die Berechtigungsattribute der hosts-Datei noch nicht geändert wurden. Wenn man sie erzwungen hochlädt, erhält man wie folgt Fehlermeldung:
C:\tools>adb push hosts.mod /system/etc/hosts adb: Fehler: Das Kopieren von 'hosts.mod' nach '' fehlgeschlagen/system/etc/hosts': Zugriffsverweigerung
Führen Sie folgenden Befehl aus:
root@maguro:/ # chmod 666 /system/etc/hosts
Dann überprüfen Sie die Eigenschaften der hosts-Datei.
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 25 2013-08-14 07:00 hosts
Man kann sehen, dass jeder den hosts-Datei lesen und schreiben kann.
Da alles bereit ist, versuchen wir es noch einmal, den geänderten hosts-Datei hochzuladen.
C:\tools>adb push hosts.mod /system/etc/hosts adb: Fehler: Das Kopieren von 'hosts.mod' nach '' fehlgeschlagen/system/etc/hosts': Lesen-nur Dateisystem
Was ist los, warum ist das Kopieren immer noch fehlgeschlagen? Haben wir den Dateisystem nicht bereits in lesbares und schreibbares Format geändert?
Und während des Suchens nach dem Grund habe ich auch eine merkwürdige Sache entdeckt. Im Root-Modus/Das Verzeichnis system ist lesbar und schreibbar, aber im Shell-Modus/system ist jedoch nur lesbar.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime... root@maguro:/ # exit shell@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
Und im Terminal Emulator auf dem Telefon/Nachdem das Verzeichnis system in lesbares und schreibbares Format gemountet wurde, überprüfen Sie im Root-Modus von adb shell/Der Zustand von system bleibt als nur lesbar angezeigt.
Ich habe im Internet gesucht und gesucht und fast verzweifelt, bis ich möglicherweise das Problem gefunden habe. Dies ist der Beitrag:Mount im Shell als Benutzer oder Root mit verschiedenen AusgabenEs gibt eine Antwort, die von diesem mount namespace spricht. Dann才知道:
Ein Mount-Namespace ist die Sammlung von Dateisystem-Mounts, die für einen Prozess sichtbar sind.
Der Mount-Punkt eines jeden Prozesses ist für andere Prozesse unsichtbar. Der Mount-Punkt nach dem Mounten im Terminal Emulator gehört zu diesem Prozess, während die Mount-Punkte im Shell-Modus und im Root-Modus von adb shell zu den jeweiligen Prozessen gehören. Dies ist der Grund, warum wir vorhin im Root-Modus geändert haben/system目录为可读写后在shell模式下仍显示为只读的原因。
知道问题的原因了,那如何解决呢?
在SuperSu应用的设置中有个mount namespace separation的选项,如下图所示:
把勾选取消,然后mount的挂载点就是全局性的了,不再为mount它们的进程所独有。不过要记住的是,只有在重启手机后该修改才有效。
下面是取消mount namespace separation后在上传的结果:
C:\tools>adb push hosts.mod /system/etc/hosts [100%] /system/etc/hosts
可以看到[100%]的回显,说明文件已经上传完成。
查看hosts文件的属性:
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 137679 2017-02-16 00:20 hosts
文件的大小已经由25变成137679,说明文件已经替换完成。
下面就是恢复手机到原先的状态:
root@maguro:/ # chmod 644 /system/etc/hosts root@maguro:/ # ls -al /system/etc/hosts -rw-r--r-- root root 137679 2017-02-16 00:20 hosts root@maguro:/ # mount -o ro,remount /system
至此,修改hosts文件的工作就算大功告成。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。