點擊藍字 ╳ 關(guān)注我們
蔣衛(wèi)峰
深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司
OS內(nèi)核開發(fā)工程師
一、 procfs介紹



二、 procfs文件系統(tǒng)的設(shè)計
struct Vnode {
enum VnodeType type; /* Vnode節(jié)點類型 */
int useCount; /* 節(jié)點鏈接數(shù) */
uint32_t hash; /* 哈希值 */
uint uid; /* 文件擁有者的user id */
uint gid; /* 文件群組id */
mode_t mode; /* 文件讀寫執(zhí)行權(quán)限 */
LIST_HEAD parentPathCaches; /* 指向父節(jié)點的路徑緩存 */
LIST_HEAD childPathCaches; /* 指向兒子節(jié)點的路徑緩存 */
struct Vnode *parent; /* vnode父節(jié)點 */
struct VnodeOps *vop; /* vnode操作接口 */
struct file_operations_vfs *fop; /* 文件操作接口,即指定文件系統(tǒng) */
void *data; /* 數(shù)據(jù),指向內(nèi)部數(shù)據(jù)的指針 */
uint32_t flag; /* 節(jié)點標(biāo)簽 */
LIST_ENTRY hashEntry; /* 掛入v_vnodeHashEntry[i]中 */
LIST_ENTRY actFreeEntry; /* 通過本節(jié)點掛載到空閑和使用鏈表中 */
struct Mount *originMount; /* 所在文件系統(tǒng)掛載信息 */
struct Mount *newMount; /* 其他掛載在這個節(jié)點中的文件系統(tǒng)信息 */
char *filePath; /* Vnode的路徑信息 */
struct page_mapping mapping; /* page mapping of the vnode */
};
struct VnodeOps {
int (*Create)(struct Vnode *parent, const char *name, int mode, struct Vnode **vnode);// 創(chuàng)建節(jié)點
int (*Lookup)(struct Vnode *parent, const char *name, int len, struct Vnode **vnode);// 查詢節(jié)點
int (*Open)(struct Vnode *vnode, int fd, int mode, int flags);// 打開節(jié)點
ssize_t (*ReadPage)(struct Vnode *vnode, char *buffer, off_t pos);
ssize_t (*WritePage)(struct Vnode *vnode, char *buffer, off_t pos, size_t buflen);
int (*Close)(struct Vnode *vnode);// 關(guān)閉節(jié)點
int (*Reclaim)(struct Vnode *vnode);// 回收節(jié)點
int (*Unlink)(struct Vnode *parent, struct Vnode *vnode, const char *fileName);// 取消硬鏈接
int (*Rmdir)(struct Vnode *parent, struct Vnode *vnode, const char *dirName);// 刪除目錄節(jié)點
int (*Mkdir)(struct Vnode *parent, const char *dirName, mode_t mode, struct Vnode **vnode);// 創(chuàng)建目錄節(jié)點
int (*Readdir)(struct Vnode *vnode, struct fs_dirent_s *dir);// 讀目錄節(jié)點信息
int (*Opendir)(struct Vnode *vnode, struct fs_dirent_s *dir);// 打開目錄節(jié)點
int (*Rewinddir)(struct Vnode *vnode, struct fs_dirent_s *dir);// 定位目錄節(jié)點
int (*Closedir)(struct Vnode *vnode, struct fs_dirent_s *dir);// 關(guān)閉目錄節(jié)點
int (*Getattr)(struct Vnode *vnode, struct stat *st);// 獲取節(jié)點屬性
int (*Setattr)(struct Vnode *vnode, struct stat *st);// 設(shè)置節(jié)點屬性
int (*Chattr)(struct Vnode *vnode, struct IATTR *attr);// 改變節(jié)點屬性
int (*Rename)(struct Vnode *src, struct Vnode *dstParent, const char *srcName, const char *dstName);
int (*Truncate)(struct Vnode *vnode, off_t len);// 縮小或擴大
int (*Truncate64)(struct Vnode *vnode, off64_t len);
int (*Fscheck)(struct Vnode *vnode, struct fs_dirent_s *dir);
int (*Link)(struct Vnode *src, struct Vnode *dstParent, struct Vnode **dst, const char *dstName);
int (*Symlink)(struct Vnode *parentVnode, struct Vnode **newVnode, const char *path, const char *target);
ssize_t (*Readlink)(struct Vnode *vnode, char *buffer, size_t bufLen);
};int VnodesInit(void)
{
int retval = LOS_MuxInit(&g_vnodeMux, NULL);
if (retval != LOS_OK) {
PRINT_ERR("Create mutex for vnode fail, status: %d", retval);
return retval;
}
LOS_ListInit(&g_vnodeFreeList);
LOS_ListInit(&g_vnodeVirtualList);
LOS_ListInit(&g_vnodeActiveList);
retval = VnodeAlloc(NULL, &g_rootVnode);
if (retval != LOS_OK) {
PRINT_ERR("VnodeInit failed error %d
", retval);
return retval;
}
g_rootVnode->mode = S_IRWXU | S_IRWXG | S_IRWXO | S_IFDIR;
g_rootVnode->type = VNODE_TYPE_DIR;
g_rootVnode->filePath = "/";
return LOS_OK;
}struct Mount {
LIST_ENTRY mountList; /* 全局Mount鏈表 */
const struct MountOps *ops; /* Mount的功能函數(shù) */
struct Vnode *vnodeBeCovered; /* 要被掛載的節(jié)點 */
struct Vnode *vnodeCovered; /* 要掛載的節(jié)點 */
struct Vnode *vnodeDev; /* 設(shè)備vnode */
LIST_HEAD vnodeList; /* Vnode表的表頭 */
int vnodeSize; /* Vnode表的節(jié)點數(shù)量 */
LIST_HEAD activeVnodeList; /* 激活的節(jié)點鏈表 */
int activeVnodeSize; /* 激活的節(jié)點數(shù)量 */
void *data; /* 數(shù)據(jù),指向內(nèi)部數(shù)據(jù)的指針 */
uint32_t hashseed; /* Random seed for vfshash */
unsigned long mountFlags; /* 掛載標(biāo)簽 */
char pathName[PATH_MAX]; /* 掛載點路徑 */
char devName[PATH_MAX]; /* 設(shè)備名稱 /dev/sdb-1 */
};
struct MountOps {
int (*Mount)(struct Mount *mount, struct Vnode *vnode, const void *data);
int (*Unmount)(struct Mount *mount, struct Vnode **blkdriver);
int (*Statfs)(struct Mount *mount, struct statfs *sbp);//統(tǒng)計文件系統(tǒng)的信息,類型、大小等
int (*Sync)(struct Mount *mount);
};struct file
{
unsigned int f_magicnum; /* file magic number. -- to be deleted */
int f_oflags; /* Open mode flags */
struct Vnode *f_vnode; /* Driver interface */
loff_t f_pos; /* File position */
unsigned long f_refcount; /* reference count */
char *f_path; /* File fullpath */
void *f_priv; /* Per file driver private data */
const char *f_relpath; /* realpath. -- to be deleted */
struct page_mapping *f_mapping; /* mapping file to memory */
void *f_dir; /* DIR struct for iterate the directory if open a directory */
const struct file_operations_vfs *ops;
int fd;
};struct file_operations_vfs
{
/* The device driver open method differs from the mountpoint open method */
int (*open)(struct file *filep);
int (*close)(struct file *filep);
ssize_t (*read)(struct file *filep, char *buffer, size_t buflen);
ssize_t (*write)(struct file *filep, const char *buffer, size_t buflen);
off_t (*seek)(struct file *filep, off_t offset, int whence);
int (*ioctl)(struct file *filep, int cmd, unsigned long arg);
int (*mmap)(struct file* filep, struct VmMapRegion *region);
/* The two structures need not be common after this point */
int (*poll)(struct file *filep, poll_table *fds);
int (*stat)(struct file *filep, struct stat* st);
int (*fallocate)(struct file* filep, int mode, off_t offset, off_t len);
int (*fallocate64)(struct file *filep, int mode, off64_t offset, off64_t len);
int (*fsync)(struct file *filep);
ssize_t (*readpage)(struct file *filep, char *buffer, size_t buflen);
int (*unlink)(struct Vnode *vnode);
};



三、 procfs文件系統(tǒng)的實現(xiàn)
const struct MountOps procfs_operations = {
.Mount = VfsProcfsMount,
.Unmount = NULL,
.Statfs = VfsProcfsStatfs,
};
static struct VnodeOps g_procfsVops = {
.Lookup = VfsProcfsLookup,
.Getattr = VfsProcfsStat,
.Readdir = VfsProcfsReaddir,
.Opendir = VfsProcfsOpendir,
.Closedir = VfsProcfsClosedir,
.Truncate = VfsProcfsTruncate
};
static struct file_operations_vfs g_procfsFops = {
.read = VfsProcfsRead,
.write = VfsProcfsWrite,
.open = VfsProcfsOpen,
.close = VfsProcfsClose
};
// 注冊文件系統(tǒng)名字以及實現(xiàn)的接口方法等
FSMAP_ENTRY(procfs_fsmap,"procfs",procfs_operations,FALSE,FALSE);// 系統(tǒng)的入口函數(shù)
main(VOID)
|-> OsMain() // ./liteos/kernel/liteos_a/kernel/common/main.c
| // 進行系統(tǒng)的相關(guān)初始化工作
| -> EarliestInit()
| -> ...
|
| -> KModInit()
|-> ...
|
|-> OsInitCall(LOS_INIT_LEVEL_KMOD_EXTENDED) // 生成procfs文件系統(tǒng)并掛載到/proc目錄
|-> InitLevelCall(level)//根據(jù)不同的級別進行相關(guān)初始化工作,procfs的級別是8,其級別是文件系統(tǒng)向OS注冊的
| // ./liteos/kernel/liteos_a/fs/proc/os_adapt/proc_init.c
|
|-> ProcFsInit() // 進行procfs文件系統(tǒng)的具體初始化工作
| |-> mkdir(PROCFS_MOUNT_POINT, PROCFS_DEFAULT_MODE) // 先生成/proc目錄,之后需要將procfs文件系統(tǒng)掛載到該目錄下
| |-> mount(NULL, PROCFS_MOUNT_POINT, "procfs", 0, NULL)
| | // 生成mount文件,包括分配Vnode和掛載Vnode
| |
| |-> ProcMountsInit()
| | | // procfs具體項的初始化都寫在一個獨立的文件中,例如mounts在./liteos/kernel/liteos_a/fs/proc/os_adapt/mounts_proc.c
| | |
| | |-> ProcMountsInit(void)
| | | // 創(chuàng)建mounts節(jié)點并掛載到該目錄下,NULL位parent為父節(jié)點,若parent為NULL,則默認父節(jié)點為/proc
| | |
| | |-> CreateProcEntry("mounts", 0, NULL)
| | | // 先判斷節(jié)點是文件屬性還是目錄屬性,后選擇具體的節(jié)點創(chuàng)建函數(shù),在這選擇File節(jié)點
| | |
| | |-> ProcCreateFile(parent, name, NULL, mode)
| | |-> struct ProcDirEntry *pn = NULL
| | |-> ProcAllocNode(&parent, name, S_IFREG | mode) // 具體的分配節(jié)點
| | |-> struct ProcDirEntry *pn = NULL;
| | | // 首先對節(jié)點的合法性進行相關(guān)檢查,例如parent是否NULL,name是否NULL等
| | |
| | |-> pn = (struct ProcDirEntry *)malloc(sizeof(struct ProcDirEntry));//分配一個struct ProcDirEntry內(nèi)存地址
| | | // 對生成的節(jié)點賦予一些屬性,例如節(jié)點名字長度,權(quán)限,名字等,每個ProcDirEntry都需要指定一個ProcFile成員,里面含有具體信息
| | |
| | |-> pn->nameLen = strlen(lastName);
| | |-> pn->mode = mode;
| | |-> ret = memcpy_s(pn->name, sizeof(pn->name), lastName, strlen(lastName) + 1);
| | |-> pn->pf = (struct ProcFile *)malloc(sizeof(struct ProcFile));
| | |-> pn->pf->pPDE = pn;// ProcFile的parent是生成的pn節(jié)點
| | | // 生成對應(yīng)的節(jié)點,對節(jié)點指定相應(yīng)的函數(shù)接口后,需要掛載的父節(jié)點中
| | |
| | |-> ProcAddNode(parent, pn)
| | | // 先判斷parent是否為NULL以及pn是否已經(jīng)有parent,即判斷是否已掛載
| | |
| | | // 在這里可知一個目錄下的子目錄以及文件都是以一個單鏈表的形式存儲的,且采用的是頭插法,即最先生成的在最后面
| | |-> pn->parent = parent;
| | |-> pn->next = parent->subdir;
| | |-> parent->subdir = pn;
| |->...
| |
| |->ProcPmInit() // 目錄初始化工作
| | | // power目錄下含有子目錄,但是目錄生成的過程都一樣,在這以power文件夾為例
| | |-> struct ProcDirEntry *power = CreateProcEntry("power", S_IFDIR | S_IRWXU | S_IRWXG | S_IROTH, NULL);
| | | |-> CreateProcEntry("power", S_IFDIR | S_IRWXU | S_IRWXG | S_IROTH, NULL)
| | | | |-> // 先判斷節(jié)點是文件屬性還是目錄屬性,后選擇具體的節(jié)點創(chuàng)建函數(shù),在這選擇目錄節(jié)點
| | | | |
| | | | |-> ProcCreateDir(parent, name, NULL, mode)
| | | | | | // 這里節(jié)點創(chuàng)建和掛載和上述文件節(jié)點創(chuàng)建一樣,不再贅述
| | | | | |
| | | | | |-> ProcAllocNode(&parent, name, S_IFREG | mode) // 具體的分配節(jié)點
| | | | | |-> ProcAddNode(parent, pn)
| | | | |
| | | |
| | |-> ...
| |
|...四、procfs業(yè)務(wù)分析
-> ...
-> SysMount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags,const void *data)
|--|-> 將路徑,文件系統(tǒng)等轉(zhuǎn)化之后調(diào)用mount
| |-> mount(sourceRet, targetRet, (filesystemtype ? fstypeRet : NULL), mountflags, dataRet)
| | |-> //找到指定的文件系統(tǒng)
| | |-> fsmap = mount_findfs(filesystemtype)
| | |-> mops = fsmap->fs_mops // 為mount節(jié)點指定mount的接口函數(shù)
| | |-> //找到掛載目錄對應(yīng)的Vnode并且設(shè)置文件系統(tǒng)相關(guān)信息
| | |-> VnodeLookup(target, &mountpt_vnode, 0)
| | | |->VnodeLookupAt(path, vnode, flags, NULL)
| | | | |-> //對目錄變成絕對路徑并且從全局Vnode鏈表中開始找
| | | | |-> PreProcess(path, &startVnode, &normalizedPath)
| | | | | |-> vfs_normalize_path(NULL, originPath, &absolutePath)
| | |-> mnt = MountAlloc(mountpt_vnode, (struct MountOps*)mops)
| | |-> mops->Mount(mnt, device, data)//進入具體的procfs文件系統(tǒng)的mount函數(shù)
| | | |-> VfsProcfsMount(struct Mount *mnt, struct Vnode *device, const void *data)
| | | | |-> VnodeAlloc(&g_procfsVops, &vp);//生成一個Vnode用于掛載mount節(jié)點和procfs文件系統(tǒng)的root節(jié)點
| | | | |-> root = GetProcRootEntry(); //獲取procfs文件系統(tǒng)的根節(jié)點
| | | | |-> vp->data = root; //
| | | | |-> vp->originMount = mnt;// 將vp掛載在掛載目錄所對應(yīng)的mount節(jié)點上
| | | | |-> mnt->data = NULL;
| | | | |-> mnt->vnodeCovered = vp;// mount節(jié)點掛載的Vnode是該文件系統(tǒng),方便后續(xù)在mount鏈表中找掛載點
| | | | |-> vp->type = root->type;
|||... temp = ProcFindNode(parent, pn->name);
if (temp != NULL) {
PRINT_ERR("Error!ProcDirEntry '%s/%s' already registered
", parent->name, pn->name);
spin_unlock(&procfsLock);
return -EEXIST;
}
pn->parent = parent;
pn->next = parent->subdir;
parent->subdir=pn;


// 定義一個具體的執(zhí)行函數(shù)
int OsShellCmdWriteProc(int argc, char **argv);
// 新增命令項
SHELLCMD_ENTRY(writeproc_shellcmd,CMD_TYPE_EX,"writeproc",XARGS,(CmdCallBackFunc)OsShellCmdWriteProc);-> ...
-> // 使用shell命令喚起writeproc注冊函數(shù)
-> writeproc value >> path
|-> // 進行初始化工作,主要用于判斷輸入路徑是否合法,節(jié)點是否存在
|-> struct ProcDirEntry *handle = NULL;
|-> const char *rootProcDir = "/proc/";
|-> handle = OpenProcFile(realPath, O_TRUNC) // 若路徑合法則找到對應(yīng)的Vnode
| |-> pn = ProcFindEntry(fileName)
| | |-> int leveltotal = 0;// leveltotal用于判定文件所對應(yīng)的層級,一個/表示一層
| | | // 遍歷Vnode找到對應(yīng)的Vnode并返回
| |-> pn->flags = (unsigned int)(pn->flags) | (unsigned int)flags// 設(shè)置節(jié)點相應(yīng)的權(quán)限
| |-> ...
| WriteProcFile(handle, value, len) // 找到文件句柄之后開始寫入數(shù)據(jù)
| | // 使用Vnode的文件接口對ProcFile數(shù)據(jù)成員進行寫入
| |-> result = pde->procFileOps->write(pde->pf, (const char *)buf, len, &(pde->pf->fPos))
|...pn = &g_procRootDirEntry;
while ((pn != NULL) && (levelcount < leveltotal)) {
levelcount++;
isfoundsub = 0;
while (pn != NULL) {
next = strchr(path, '/');
if (next == NULL) {
while (pn != NULL) {
if (strcmp(path, pn->name) == 0) {
spin_unlock(&procfsLock);
return pn;
}
pn = pn->next;
}
pn = NULL;
spin_unlock(&procfsLock);
return pn;
}
len = next - path;
if (pn == &g_procRootDirEntry) {
if (levelcount == leveltotal) {
spin_unlock(&procfsLock);
return pn;
}
len = g_procRootDirEntry.nameLen;
}
if (ProcMatch(len, path, pn)) {
isfoundsub = 1;
path += len + 1;
break;
}
pn = pn->next;
}
}五、總結(jié)
原文標(biāo)題:LiteOS-A內(nèi)核中的procfs文件系統(tǒng)分析
文章出處:【微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
鴻蒙
+關(guān)注
關(guān)注
60文章
3012瀏覽量
46149 -
OpenHarmony
+關(guān)注
關(guān)注
33文章
3970瀏覽量
21336
原文標(biāo)題:LiteOS-A內(nèi)核中的procfs文件系統(tǒng)分析
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之FatFs文件系統(tǒng)介紹
即使讀者可能不了解文件系統(tǒng),讀者也一定對“文件”這個概念十分熟悉。數(shù)據(jù)在PC上是以文件的形式儲存在磁盤中的,這些數(shù)據(jù)的形式一般為ASCII 碼或二進制形式。
使用“tk(cbc(aes))”進行文件系統(tǒng)加密時出現(xiàn) iMX8MM CAAM 錯誤如何解決?
當(dāng)使用 CAAM 寫入文件系統(tǒng)以進行文件系統(tǒng)加密時,我收到以下錯誤。tk(cbc(aes))\'。
caam_jr 30902000.jr:4000141c:DECO:desc idx 20:DECO 看門狗定時器超時錯誤
這種情況只是偶爾發(fā)生,但在啟用所有
發(fā)表于 03-16 06:24
合科泰分析12V2A開關(guān)電源中TL431的故障原因
在12V 2A開關(guān)電源設(shè)計中,TL431作為關(guān)鍵的精密電壓基準,其穩(wěn)定性直接決定電源的輸出精度與可靠性。然而,該器件在此類應(yīng)用中卻成為常見的故障點之一。合科泰將系統(tǒng)分析TL431在此類
明晚8點|睿擎文件系統(tǒng)實戰(zhàn):從開發(fā)到發(fā)布全流程解析
從文件操作到鏡像發(fā)布,一次直播掌握完整開發(fā)流程!在嵌入式系統(tǒng)開發(fā)中,文件系統(tǒng)是數(shù)據(jù)存儲、配置管理和資源訪問的核心基礎(chǔ)。然而在實際開發(fā)中,
48V供電架構(gòu)中聚合物固態(tài)電容的紋波吸收能力解析
文章系統(tǒng)分析了48V供電系統(tǒng)中聚合物固態(tài)電容的紋波吸收特性,通過參數(shù)對比說明了平尚科技產(chǎn)品在AI電源應(yīng)用中的技術(shù)優(yōu)勢與實現(xiàn)路徑。
【直播預(yù)告】下周三晚8點|睿擎文件系統(tǒng)實戰(zhàn):從開發(fā)到發(fā)布全流程解析
從文件操作到鏡像發(fā)布,一次直播掌握完整開發(fā)流程!在嵌入式系統(tǒng)開發(fā)中,文件系統(tǒng)是數(shù)據(jù)存儲、配置管理和資源訪問的核心基礎(chǔ)。然而在實際開發(fā)中,
睿擎派文件系統(tǒng)指南:從開發(fā)到發(fā)布全流程實踐 | 技術(shù)解析
在嵌入式系統(tǒng)開發(fā)中,文件系統(tǒng)扮演著至關(guān)重要的角色,它負責(zé)數(shù)據(jù)的持久化存儲、配置文件管理和資源訪問等核心功能。睿擎平臺提供了一套完整的文件系統(tǒng)
在qemu上體驗芯來RISC-V處理器運行鴻蒙LiteOS-M內(nèi)核
在qemu上體驗芯來RISC-V處理器運行鴻蒙LiteOS-M內(nèi)核
1.本文概述
2.下載qemu
3.下載鴻蒙LiteOS-M
4.運行與測試
5.gdb調(diào)試
1.本文概述
由于前幾天
發(fā)表于 10-31 09:04
技術(shù)貼|【RK3588】ELF 2開發(fā)板如何添加exFAT和NTFS文件系統(tǒng)格式
基于RK3588設(shè)計的ELF2開發(fā)板在搭載Desktop22.04系統(tǒng)時,對TF卡的文件系統(tǒng)支持存在以下限制:不支持exFAT格式;支持NTFS格式,但需手動掛載;針對上述兼容性問題,本文將介紹
Linux三大主流文件系統(tǒng)解析
還在為選擇哪個文件系統(tǒng)而糾結(jié)?作為一名摸爬滾打多年的運維老鳥,我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統(tǒng)的奧秘。
飛凌嵌入式ElfBoard ELF 1板卡-文件系統(tǒng)簡介
內(nèi)存中,可以明顯地提高系統(tǒng)的性能。在Linux的啟動階段,initrd提供了一套機制,可以將內(nèi)核映像和根文件系統(tǒng)一起載入內(nèi)存。RamDisk是臨時性的,所以沒有帶日志的
發(fā)表于 06-19 17:22
服務(wù)器數(shù)據(jù)恢復(fù)—重裝系統(tǒng)導(dǎo)致XFS文件系統(tǒng)分區(qū)丟失的數(shù)據(jù)恢復(fù)案例
。通過LVM擴容的方式將sdc1分區(qū)加入到了root_lv中,剩下的sdc2分區(qū)格式化為XFS文件系統(tǒng)。
服務(wù)器重裝系統(tǒng)后,發(fā)現(xiàn)sdc2分區(qū)丟失,無法訪問。
服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)的數(shù)據(jù)恢復(fù)案例
服務(wù)器存儲數(shù)據(jù)恢復(fù)環(huán)境&故障:
人為誤操作將Ext4文件系統(tǒng)誤裝入一臺服務(wù)器存儲上的Ocfs2文件系統(tǒng)數(shù)據(jù)卷上,導(dǎo)致原Ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)。
VirtualLab:激光引導(dǎo)無焦系統(tǒng)的分析與設(shè)計
,分析了這種系統(tǒng)的經(jīng)典設(shè)計。然后,通過考慮衍射效應(yīng)并在系統(tǒng)中包括散焦或腰移,可以進一步減小幾何光學(xué)優(yōu)化給出的最小光斑尺寸。
建模任務(wù) #1-簡單的無焦
發(fā)表于 05-22 08:49
Linux文件系統(tǒng)打包及鏡像制作,觸覺智能RK3562開發(fā)板演示
本文介紹Linux開發(fā)板文件系統(tǒng)打包及鏡像制作的方法,演示Linux文件系統(tǒng)打包及鏡像制作,適用于想將配置好的系統(tǒng)環(huán)境打包成鏡像批量燒錄。觸覺智能RK3562開發(fā)板演示,搭載4核A53
LiteOS-A內(nèi)核中的procfs文件系統(tǒng)分析

評論