最近、私は自分でSamsung Galaxy Tab Pro 10.1 LTE SM-T525タブレットを購入し、自宅のsambaで共有されているネットワークドライブから映画やその他のファイルを見たいと思っていました。 これを行うには、カーネルがCIFSをサポートしている必要があります。また、バージョン4.2以降のアンドロイドでは、これは重要なタスクであることが判明しました。
1.カスタムマウントの問題の本質実際、バージョン4.2以降、Adnroidはマルチユーザーモードを導入し、すべてのファイルシステムがスレーブとしてマウントされるようになったため、1人のユーザーがマウントしたファイルシステムが他のユーザーから見えなくなります。
バージョン4.2以降のAndroid Dalvik仮想マシンでは、次のコードがvm / Init.cppファイルにあります。
if (mount("rootfs", "/", NULL, (MS_SLAVE | MS_REC), NULL) == -1) { SLOGE("Failed to mount() rootfs as MS_SLAVE: %s", strerror(errno)); return -1; }
このコードは、MS_SLAVEおよびMS_RECフラグを使用してルートファイルシステムをマウントします。つまり、/内にマウントされたファイルシステムもデフォルトでMS_SLAVEフラグを使用してマウントされ、それらをマウントしたユーザーとその子プロセスのみがアクセスできます。 この問題を解決するために、do_mount関数のカーネル用の次のパッチがxda-developersを使用して
mkasickユーザーによって提案されました。
パッチの本質は、MS_SVALEおよびMS_RECフラグを使用して/のdo_mount呼び出しをインターセプトし、それらを設定させないことです。 しかし、Androidが機能するには、これらのフラグが/ストレージ内のカスタムファイルシステムに必要です。そうしないと、システムが起動しません。 したがって、do_mount(NULL、(char *)storage、NULL、(MS_SLAVE | MS_REC)、NULL))== 0)を呼び出します。 最後の呼び出しが機能するには、/ storageがディレクトリだけでなくマウントポイントである必要があるため、/ storageディレクトリが作成されるramdiskのinit.rcファイルで、tmpfsをマウントする必要があります。
mkdir /storage 0050 root sdcard_r mount tmpfs tmpfs /storage mode=0050,uid=0,gid=1028
これらの操作の後、/ストレージの外部のマウントポイントはすべてのユーザーに表示されます。
2.カーネルアセンブリまず、LinuxカーネルにCIFSサポートを追加する必要があります。 これを行うには2つの方法があります。cifsカーネル用のモジュールをコンパイルするか、cifsサポートをカーネル自体に追加します。 最初の方法の方が良い、なぜなら 新しいカーネルをフラッシュして一部のデバイスの保証を失う必要はありません。
タブレットのコアはモジュールのサポートなしで組み立てられることが判明したため、新しいカーネルを再構築してフラッシュする必要がありました。
カーネルを構築するには、次のものが必要です。
a)Linuxマシン
b)デバイスのカーネルソース
。Samsungの場合はopensource.samsung.comを取得します
c)アセンブリ用のツールチェーン、
developer.android.com / tools / sdk / ndk / index.htmlをご覧ください
カーネルを構築するには、〜/ androidディレクトリを作成し、その中のカーネルソースをandroid-ndk-r9のandroid-ndkディレクトリに展開します
mkdir ~/android cd ~/android tar xjf android-ndk-r9d-linux-x86_64.tar.bz2 unzip SM-T525_SEA_KK_Opensource.zip mkdir kernel cd kernel tar xzf ../Kernel.tar.gz
ここでパッチを適用して、空のマウントポイントの問題を修正します
patch -p1 < shared_rootfs.patch
次に、環境変数を登録してカーネル構成ファイルを準備する必要があります。Samsungの場合は次のようになります。
export CROSS_COMPILE="~/android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-" export ARCH="arm" make mrproper make VARIANT_DEFCONFIG=msm8974_sec_picassoeur_defconfig msm8974_sec_defconfig SELINUX_DEFCONFIG=selinux_defconfig
このコマンドは.configファイルを作成します。その後、
make menuconfigコマンドを実行し、[ファイルシステム]-> [ネットワークファイルシステム]セクションに移動し、CIFSサポート項目を確認する必要があります(モジュールが構築されている場合、文字Mでマークします)。ファイルシステムセクションでRESTRICT_ROOTFS_SLAVEをマークします

次に、Escで終了し、構成を保存します。 ここで、コマンド
make -j3を使用してカーネルをアセンブルします(数値3の代わりに、プロセッサコアの数+ 1を示します)。
これでカーネルアセンブリが完了します。
3.ファームウェア用のboot.imgをビルドします次に、新しいカーネルをタブレットにフラッシュする必要があります。 これを行うには、カーネル、ramdisk、およびQualcommチップのデバイスツリーを含むboot.imgイメージを構築する必要があります。
最初に、ネイティブRAMディスクを取得する必要があります。これには、元のファームウェア(これは通常のtar)を解凍し、そこからboot.imgファイルを取得します
tar xf T525XXUANB2_T525SERANA6_T525XXUANA7_HOME.tar.md5 boot.img
boot.imgを展開するには、
bootimg_toolsパッケージが必要です。
〜/ androidにダウンロードし、split_bootコマンドでboot.imgファイルを解凍します。
mkdir ~/adndroid/bootimg_tools cd ~/adnroid/bootimg_tools unzip ../bootimg_tools_7.8.13.zip ./split_boot ../boot.img
そして、boot / ramdiskディレクトリに解凍されたramdiskを取得します
次に、ramdisk内のいくつかのファイルを修正して、Selinuxを許容モードに変換し、tmpfsとしてマウント/ストレージする必要があります。
init.rcファイルで、
setsebool debugfs 1という行を探し、次の行に置き換えます。
setsebool debugfs 0 setenforce 0
次に、行setprop
selinux.reload_policy 1を探して、
setprop selinux.reload_policy 0に変更し
ます。tmpfsとして/ storageをマウントするには、
mkdir / storage 0751 root sdcard_rの行を探して、その後に追加します
mount tmpfs tmpfs /storage mode=0050,uid=0,gid=1028
また、defaul.propファイルで、
ro.secure = 1を
ro.secure = 0に変更し、
ro.adb.secure = 1を
ro.adb.secure = 0に変更します
。ラムディスクを回収します
./repack_ramdisk boot/ramdisk ramdisk.cpio.gz cp boot/ramdisk.cpio.gz ~/android/kernel
さらに、アセンブリには、まだdt.imgファイルが必要です。このファイルは、カーネルに付属しているdtbToolユーティリティによって生成されます
cd ~/android/kernel ./tools/dtbTool -o dt.img -s 2048 -p ./scripts/dtc/ ./arch/arm/boot/
boot.imgをビルドするために必要なものがすべて揃ったので、mkbootimgユーティリティを使用してアセンブリ自体を開始します(カーネルにも付属しています)。
./tools/mkbootimg --kernel ./arch/arm/boot/zImage --ramdisk ramdisk.cpio.gz --cmdline 'console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3' --base 0x00000000 --pagesize 2048 --ramdisk_offset 0x02000000 --tags_offset 0x01E00000 --dt dt.img -o boot.img
すべて、boot.imgファイルの準備ができました。 Odinを介してフラッシュするには、そこからboot.tar.md5を作成します
tar -H ustar -c boot.img > boot.tar md5sum -t boot.tar >> boot.tar mv boot.tar boot.tar.md5
今オーディンを介してそれをフラッシュ

Samsungでは、wifiがkatomカーネルでの動作を停止するという問題があります。これは、動作中のシステムでbuild.propファイルを編集することで処理されます。 行
ro.securestorage.support = trueを
ro.securestorage.support = falseに置き換える必要があり
ます4.マウント用のソフトウェアのセットアップボールをマウントするには、
CifsManagerプログラムを使用し
ます
セットアップにはいくつかのニュアンスがあります。
a)3.4カーネルのcifsで何かが壊れていましたが、現在はmountコマンドのデバイスパラメーターを処理しません。 デザインを見る
mount -t cifs //pc/share /mnt
なくなりました。マウントされたボールはuncパラメーターで指定する必要があります。 前のコマンドは次のようになります。
mount -t cifs -o unc=\\\\pc\\share none /mnt
b)マウントポイントについて。 上記のように、/ストレージの内部にマウントすると、そのようなボールは他のアプリケーションでは空になります./ストレージの外部のどこかにマウントすると、ほとんどのアプリケーションはそれを開くことができません メモリカード内でのみファイルを開くことができます。 抜け道があります。 内部メモリ/ストレージ/エミュレート/ 0は実際には/データ/メディア/ 0にあり、/ストレージ/エミュレート/ 0はこのディレクトリのfat32エミュレーションです。 したがって、たとえば/ data / media / 0 / cifsに安全にマウントし、内部ストレージのファイルマネージャーでボールを確認できます。
c)まだ説明されていないニュアンスがあります;何らかの理由でmount -t cifsコマンドは、たとえばコマンド内のパスワードの後に来るパラメーターを無視します
mount -t cifs -o unc=\\\\pc\\share,username=user,password=123,sec=ntlmssp none /data/media/0/cifs
sec = ntlmsspパラメーターは処理されません。 したがって、ボールに接続するためにパスワードが必要な場合は、CifsManagerで[パスワード]フィールドを空のままにし、上記のスクリーンショットのように最後の[オプション]フィールドにパスワードを書き込みます。
d)ファイル名にロシア語の文字を正しく使用するには、オプションiocharset = utf8を追加する必要があります
CifsManagerでボールをマウントしてお楽しみください!
次のソースの資料を使用しました。
www.ibm.com/developerworks/en/library/l-mount-namespacesforum.xda-developers.com/showthread.php?p=36889027www.netzgewitter.com/2013/10/troubleshoot-cifs-on-android