ホームページ  >  記事  >  バックエンド開発  >  簡単なファイルシステムの書き方 (4): umount_PHP チュートリアル

簡単なファイルシステムの書き方 (4): umount_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:55:571113ブラウズ

簡単なファイルシステムの書き方 (4): umount

はは、数年後、ディスクの奥からオリジナルのコード簡単なファイルシステムの書き方 (4): umount_PHP チュートリアルmyfs.zipを見つけました。
------------------------------------------無敵の分かれ目----- ------------------------

私は現在、この一連のブログを完成させるために、ブロック デバイスに基づいた小さなファイル システムを作成する準備をしています。 今回は 3.10 カーネルに基づいて記述されています。前3回の記事とは少し違うかもしれません。
umount はファイルシステムをアンマウントします。では、ファイルシステムをアンインストールするには何をする必要があるのでしょうか?すべてのデータ (ファイル データであるかファイル システム データであるか) を更新する必要があるデバイス上で
将来的には、ファイル データをメディア データと呼び、ファイル システム データ (inode、スーパーブロックなど) をメタデータと呼びます。
前の記事の mount の fill super で、次のコード行を見ました:
sb->s_op = &dfs_sops;
これは、sb にスーパー ブロック演算構造を与えることです。もちろん、これを与えなかった場合でも、当面はアンマウント操作には影響しませんが、デバイス上のすべてのデータは更新されません。 UConst Struct Super_operations DFS_SOPS = {
.alloc_inode = dfs_alloc_inode,
.put_super = dfs_put_super,
. Sync_fs = dfs_sync_fs,
}; マウント プロセスで使用される alloc_inode に加えて、2 つの関数が追加されます。1 つは put_super と呼ばれます。もう 1 つは sync_fs と呼ばれます。
Put_super はデバイス上のスーパー ブロックを更新するために使用され、sync_fs はファイル システムを同期するために使用されます。つまり、すべてのダーティ ファイルをデバイスに更新します。
まだファイルを作成/更新する準備ができていないため、ここでは put_super 関数のみを実装します。 IStatic void DFS_PUT_SUPER (Struct Super_block *SB) {
Struct DFS_SB_INFO *SBI = DFS_SB (SB);


dfs_trace ("%sn", __func __);
return dfs_write_super (SB ); sbi);
}


static int dfs_sync_fs(struct super_block *sb, int wait)
{
dfs_trace("%sn", __func__);
dfs_put_super(sb);
/* todo: ファイルも同期します*/
return 0;
}

static void dfs_write_super(struct super_block *sb)
{
struct dfs_sb_info *sbi = DFS_SB(sb);
structbuffer_head *bh;
struct dfs_super_block ds;

dfs_trace( "%sn" , __func__);
#defineDFS_SB_BLOCK 0
if (!(bh = sb_bread(sb, DFS_SB_BLOCK)))
return;
/* スーパーブロックを更新 */
ds.inode_count = sbi->inode_count;
ds.block_size = sbi->block_size;
ds.total_blocks = sbi->total_blocks;
ds.free_blocks = sbi->free_blocks;
ds.used_blocks = sbi->used_blocks;
ds.bad_blocks = sbi->bad_blocks;
ds.inode_size = sbi->inode_size;
ds.magic = sbi->magic;
ds.max_inode_no = sbi->max_inode_no;
memcpy((void*)(bh->b_data ), &ds, sizeof(struct dfs_super_block));
mark_buffer_dirty(bh);
sync_dirty_buffer(bh);
return brelse(bh);
}

root:/ # mount -t dfs /dev/block/bootdevice/by -name/oem /oem
mount -t dfs /dev/block/bootdevice/by-name/oem /oem
root/ # mount
rootfs / rootfs ro,seclabel 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid, relatime,mode= 755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs / sys/fs/ selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw, seclabel,relatime, mode=750,gid=1000 0 0
tmpfs /mnt tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
adb / dev/usb- ffs/adb functionfs rw,relatime 0 0
/dev/block/dm-0 /system ext4 ro,seclabel,relatime,discard,data=owned 0 0
/dev/block/bootdevice/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=順序付けされた 0 0
/dev/block/bootdevice/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=順序付けられた 0 0
/dev/ block/bootdevice/by-name/dsp /dsp ext4 rw,seclabel,nosuid,nodev,relatime,data=owned 0 0
/dev/block/bootdevice/by-name/modem /firmware vfat ro,context =u:object_r :firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname= lower,errors=remount-ro 0 0
tmpfs /storage tmpfs rw ,seclabel,relatime,mode=755,gid=1000 0 0
/dev/block/dm-1 /data ext4 rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=owned 0 0
/dev/fuse /mnt/runtime/default/エミュレートされたヒューズ rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/エミュレートされたヒューズ rw,nosuid, nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /mnt/runtime/read/emulated furuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023 ,default_permissions,allow_other 0 0
/dev/fuse /mnt/runtime/write/emulated furuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/bootdevice /by-name/oem /oem dfs rw,relatime 0 0
root:/ # umount /oem
umount /oem

cd /oem の試行中に問題が発見されました。
root/ # cd oem
cd oem
/system/bin/sh: cd: /oem: Not a directory

カーネルが lookup 関数を実装していないことが判明しました。次の
static struct dentry *dfs_lookup( struct inode *dir, struct dentry *dentry, unsigned int flags)
{
return NULL; // 一時的に空で、何も見つかりません。
}

const struct inode_operations dfs_inode_operations = {
.getattr = dfs_getattr,
.lookup = dfs_lookup,
};

www.bkjia.com本当http://www.bkjia.com/PHPjc/1114326.html技術記事簡単なファイル システムの書き方 (4): umount はは、数年後、ディスクの奥から元のコード myfs.zip を見つけました。 --------------------------------------無敵の師団…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。