新聞中心
隨著信息技術(shù)的發(fā)展,越來越多的機構(gòu)、企業(yè)和個人開始選擇使用 Linux 操作系統(tǒng)。在 Linux 中,銷毀對象是一項非常重要的操作,因為不恰當(dāng)?shù)匿N毀會導(dǎo)致敏感數(shù)據(jù)泄露,從而造成嚴(yán)重的后果。本文將介紹 Linux 中銷毀對象的方式及注意事項,以幫助用戶更好地保護自己的敏感數(shù)據(jù)。

成都創(chuàng)新互聯(lián)公司成立十多年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)站策劃、網(wǎng)頁設(shè)計、國際域名空間、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)公司通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
I. 為什么銷毀對象如此重要
在 Linux 中,銷毀對象是一項重要的操作,它涉及到安全和隱私問題。如果敏感數(shù)據(jù)泄露,會給個人、組織或者企業(yè)帶來嚴(yán)重的后果。因此,銷毀對象尤為重要。
II. Linux 中銷毀對象的方式
1. 常用的銷毀方法
在 Linux 操作系統(tǒng)中,銷毀對象的方法有很多,如下:
(1)物理銷毀
物理銷毀是一種常用的銷毀對象的方法,它是指將設(shè)備或者磁盤物理破壞的過程。由于物理銷毀需要將設(shè)備或磁盤破壞,因此它只適用于不需要使用設(shè)備或磁盤再次使用的情況,比如退役的設(shè)備或磁盤。
(2)邏輯銷毀
邏輯銷毀是一種比較安全的銷毀對象的方法,它是指將數(shù)據(jù)從設(shè)備或磁盤中完全刪除的過程。邏輯銷毀需要使用特定的工具,如 shred、dd 和 wipe。
shred 命令:該命令可執(zhí)行對指定文件多次隨機覆蓋,從而安全地刪除文件。
使用方法如下:
shred file_name
dd 命令:該命令可以將設(shè)備或磁盤中的指定區(qū)域刪除。
使用方法如下:
dd if=/dev/zero of=/dev/sdX bs=1M
wipe 命令:該命令可以安全地擦除文件和目錄。
使用方法如下:
wipe file_name
2. 額外的方式
(1)加密銷毀
加密銷毀是一種比較新的方式,它是利用加密技術(shù)將數(shù)據(jù)加密,并使用強密碼保護數(shù)據(jù),從而保證數(shù)據(jù)的安全性。
(2)虛擬機銷毀
虛擬機銷毀是一種相對安全的銷毀對象的方法,它是指將虛擬機中的數(shù)據(jù)全部刪除,重建虛擬機環(huán)境。虛擬機銷毀可避免物理硬件的破壞和邏輯破壞。
III. 銷毀對象的注意事項
1. 備份數(shù)據(jù)
在銷毀對象之前,一定要先備份數(shù)據(jù),以免誤操作導(dǎo)致不可挽回的后果。
2. 安全地銷毀
在銷毀對象時,一定要選擇正確的方法,并確保安全地銷毀,避免泄露敏感數(shù)據(jù)導(dǎo)致信息泄露的風(fēng)險。
3. 驗證銷毀
銷毀對象完成后,一定要驗證是否成功銷毀。可以使用數(shù)據(jù)恢復(fù)工具檢查是否有未刪除的文件。
4. 避免誤操作
刪除操作錯誤可能會導(dǎo)致數(shù)據(jù)無法恢復(fù)。在執(zhí)行刪除操作之前,請務(wù)必小心,確保正確選擇對象并準(zhǔn)確執(zhí)行。
IV. 結(jié)論
在 Linux 操作系統(tǒng)中,銷毀對象是非常重要的事情。正確選擇銷毀方式可以避免敏感數(shù)據(jù)泄露和信息泄露的風(fēng)險。同時,用戶必須遵循安全的銷毀對象的實踐,并遵守有關(guān)的注意事項。這有助于保護敏感數(shù)據(jù),并確保數(shù)據(jù)的安全。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220Handler消息機制(一):Linux的epoll機制
在linux 沒有實現(xiàn)epoll事件驅(qū)動機制之前,我們一般選擇用select或者poll等IO多路復(fù)用的方法來實現(xiàn)并發(fā)服務(wù)程序。在linux新的內(nèi)核中,有了一種替換它的機制,就是epoll。
相比select模型,
poll使用鏈表保存文件描述符,因此沒有了監(jiān)視文件數(shù)量的限制
,但其他三個缺點依然存在。
假設(shè)我們的服務(wù)器需要支持100萬的并發(fā)連接,則在__FD_SETSIZE 為1024的情況下,則我們至少需要開辟1k個進程才能實現(xiàn)100萬的并發(fā)連接。除了進程間上下文切換的時間消耗外,從內(nèi)核/用戶空間大量的無腦內(nèi)存拷貝、數(shù)組輪詢等,是系統(tǒng)難以承受的。因此,基于select模型的服務(wù)器程序,要達到10萬級別的并發(fā)訪問,是一個很難完成的任務(wù)。
由于epoll的實現(xiàn)機制與select/poll機制完全不同,上面所說的 select的缺點在epoll上不復(fù)存在。
設(shè)想一下如下場景:有100萬個客戶端同時與一個服務(wù)器進程保持著TCP連接。而每一時刻,通常只有幾百上千個TCP連接是活躍的(事實上大部分場景都是這種情況)。如何實現(xiàn)這樣的高并發(fā)?
在select/poll時代,服務(wù)器進程每次都把這100萬個連接告訴操作系統(tǒng)(從用戶態(tài)復(fù)制句柄數(shù)據(jù)結(jié)構(gòu)到內(nèi)核態(tài)),讓操作系統(tǒng)內(nèi)核去查詢這些套接字上是否有事件發(fā)生,輪詢完后,再將句柄數(shù)據(jù)復(fù)制到用戶態(tài),讓服務(wù)器應(yīng)用程序輪詢處理已發(fā)生的網(wǎng)絡(luò)事件,這一過程資源消耗較大,因此,select/poll一般只能處理幾千的并發(fā)連接。
epoll的設(shè)計和實現(xiàn)與select完全不同。epoll通過在Linux內(nèi)核中申請一個簡易的文件系統(tǒng)(文件系統(tǒng)一般用什么數(shù)據(jù)結(jié)構(gòu)實現(xiàn)?B+樹)。把原先的select/poll調(diào)用分成了3個部分:
1)調(diào)用epoll_create()建立一個epoll對象(在epoll文件系統(tǒng)中為這個句柄對象分配資源)
2)調(diào)用epoll_ctl向epoll對象中添加這100萬個連接的套接字
3)調(diào)用epoll_wait收集發(fā)生的事件的連接
如此一來,要實現(xiàn)上面說是的場景,只需要在進程啟動時建立一個epoll對象,然后在需要的時候向這個epoll對象中添加或者刪除連接。同時,epoll_wait的效率也非常高,因為調(diào)用epoll_wait時,并沒有一股腦的向操作系統(tǒng)復(fù)制這100萬個連接的句柄數(shù)據(jù),內(nèi)核也不需要去遍歷全部的連接。
當(dāng)某一進程調(diào)用epoll_create方法時,Linux內(nèi)核會創(chuàng)建一個eventpoll結(jié)構(gòu)體,這個結(jié)構(gòu)體中有兩個成員與epoll的使用方式密切相關(guān)。eventpoll結(jié)構(gòu)體如下所示:
每一個epoll對象都有一個獨立的eventpoll結(jié)構(gòu)體,用于存放通過epoll_ctl方法向epoll對象中添加進來的事件。這些事件都會掛載在紅黑樹中,如此,重復(fù)添加的事件就可以通過紅黑樹而高效的識別出來(紅黑樹的插入時間效率是lgn,其中n為樹的高度)。
而所有
添加到epoll中的事件都會與設(shè)備(網(wǎng)卡)驅(qū)動程序建立回調(diào)關(guān)系,也就是說,當(dāng)相應(yīng)的事件發(fā)生時會調(diào)用這個回調(diào)方法
。這個回調(diào)方法在內(nèi)核中叫ep_poll_callback,它會將發(fā)生的事件添加到rdlist雙鏈表中。
在epoll中,對于每一個事件,都會建立一個epitem結(jié)構(gòu)體,如下所示:
當(dāng)調(diào)用epoll_wait檢查是否有事件發(fā)生時,只需要檢查eventpoll對象中的rdlist雙鏈表中是否有epitem元素即可。如果rdlist不為空,則把發(fā)生的事件復(fù)制到用戶態(tài),同時將事件數(shù)量返回給用戶。
epoll結(jié)構(gòu)示意圖
通過紅黑樹和雙鏈表數(shù)據(jù)結(jié)構(gòu),并結(jié)合回調(diào)機制,造就了epoll的高效。
events可以是以下幾個宏的:
EPOLLIN:觸發(fā)該事件,表示對應(yīng)的文件描述符上有可讀數(shù)據(jù)。(包括對端SOCKET正常關(guān)閉);
EPOLLOUT:觸發(fā)該事件,表示對應(yīng)的文件描述符上可以寫數(shù)據(jù);
EPOLLPRI:表示對應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀(這里應(yīng)該表示有帶外數(shù)據(jù)到來);
EPOLLERR:表示對應(yīng)的文件描述符發(fā)生錯誤;
EPOLLHUP: 表示對應(yīng)的文件描述符被掛斷;
EPOLLET:將EPOLL設(shè)為邊緣觸發(fā)(EdgeTriggered)模式,這是相對于水平觸發(fā)(Level Triggered)來說的。
EPOLLONESHOT: 只監(jiān)聽一次事件,當(dāng)監(jiān)聽完這次事件之后,如果還需要繼續(xù)監(jiān)聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里。
示例:
ET(EdgeTriggered)
:高速工作模式,只支持no_block(非阻塞模式)。在此模式下,當(dāng)描述符從未就緒變?yōu)榫途w時,內(nèi)核通過epoll告知。然后它會假設(shè)用戶知道文件描述符已經(jīng)就緒,并且不會再為那個文件描述符發(fā)送更多的就緒通知,直到某些操作導(dǎo)致那個文件描述符不再為就緒狀態(tài)了。(觸發(fā)模式只在數(shù)據(jù)就緒時通知一次,若數(shù)據(jù)沒有讀完,下一次不會通知,直到有新的就緒數(shù)據(jù))
LT(LevelTriggered)
:缺省工作方式,支持blocksocket和no_blocksocket。在LT模式下內(nèi)核會告知一個文件描述符是否就緒了,然后可以對這個就緒的fd進行IO操作。如果不作任何操作,內(nèi)核還是會繼續(xù)通知!若數(shù)據(jù)沒有讀完,內(nèi)核也會繼續(xù)通知,直至設(shè)備數(shù)據(jù)為空為止!
1.我們已經(jīng)把一個用來從管道中讀取數(shù)據(jù)的文件句柄(RFD)添加到epoll描述符
\2. 這個時候從管道的另一端被寫入了2KB的數(shù)據(jù)
\3. 調(diào)用epoll_wait(2),并且它會返回RFD,說明它已經(jīng)準(zhǔn)備好讀取操作
\4. 然后我們讀取了1KB的數(shù)據(jù)
\5. 調(diào)用epoll_wait(2)……
ET工作模式:
如果我們在第1步將RFD添加到epoll描述符的時候使用了EPOLLET標(biāo)志,在第2步執(zhí)行了一個寫操作,第三步epoll_wait會返回同時通知的事件會銷毀。因為第4步的讀取操作沒有讀空文件輸入緩沖區(qū)內(nèi)的數(shù)據(jù),因此我們在第5步調(diào)用epoll_wait(2)完成后,是否掛起是不確定的。epoll工作在ET模式的時候,必須使用非阻塞套接口,以避免由于一個文件句柄的阻塞讀/阻塞寫操作把處理多個文件描述符的任務(wù)餓死。
只有當(dāng)read(2)或者write(2)返回EAGAIN時(認(rèn)為讀完)才需要掛起,等待。但這并不是說每次read()時都需要循環(huán)讀,直到讀到產(chǎn)生一個EAGAIN才認(rèn)為此次事件處理完成,當(dāng)read()返回的讀到的數(shù)據(jù)長度小于請求的數(shù)據(jù)長度時(即小于sizeof(buf)),就可以確定此時緩沖中已沒有數(shù)據(jù)了,也就可以認(rèn)為此事讀事件已處理完成。
LT工作模式:
LT方式調(diào)用epoll接口的時候,它就相當(dāng)于一個速度比較快的poll(2),并且無論后面的數(shù)據(jù)是否被使用,因此他們具有同樣的職能。
當(dāng)調(diào)用 epoll_wait檢查是否有發(fā)生事件的連接時,只是檢查 eventpoll對象中的 rdllist雙向鏈表是否有 epitem元素而已,如果 rdllist鏈表不為空,則把這里的事件復(fù)制到用戶態(tài)內(nèi)存中,同時將事件數(shù)量返回給用戶。因此,epoll_wait的效率非常高。epoll_ctl在向 epoll對象中添加、修改、刪除事件時,從 rbr紅黑樹中查找事件也非???,也就是說,epoll是非常高效的,它可以輕易地處理百萬級別的并發(fā)連接。
1.減少用戶態(tài)和內(nèi)核態(tài)之間的文件句柄拷貝;
2.減少對可讀可寫文件句柄的遍歷。
linux內(nèi)存池能分配連續(xù)物理內(nèi)存嗎
處理器通過地址訪問內(nèi)存單元,程序中用到的基址加偏移地址是線性地址,需要通過MMU將虛擬地址映射成物理地址。這給分配和釋放內(nèi)存帶來方便:1)物理地址不連續(xù)的空間可以映射為邏輯上連續(xù)的虛擬地址。2)進程可以獲得比實際內(nèi)存大的”空間”,虛擬內(nèi)存使得進程在這種情況下仍可正常運行。
linux內(nèi)核為驅(qū)動程序提供了一致的內(nèi)存管理接口,因此不用考慮不同體系結(jié)構(gòu)如何管理內(nèi)存的。
在linux內(nèi)核中分配內(nèi)存用kmalloc和kfree。
kmalloc分配時可以被阻塞,且不對所獲得的區(qū)域清零。它分配的區(qū)域在物理內(nèi)存中也是連續(xù)的。
原型:
#include
void *kmalloc(size_t size,int flags); //參數(shù)為分配大小及分配標(biāo)志
flags參數(shù):
GFP_KERNEL:內(nèi)核內(nèi)存通用分配方法,表示內(nèi)存分配是由運行在內(nèi)核空間的進程執(zhí)行的??尚菝?,所以使用GFP_KERNEL分配內(nèi)存的函數(shù)必須是可重入的。
GFP_ATOMIC:用于在中斷處理例程或者運行在進程上下文之外的代碼中分配內(nèi)存,不可休眠。內(nèi)核通常會為原子性的分配預(yù)留一些空閑頁面。
所有標(biāo)志定義在 中。
size參數(shù):
內(nèi)核是基于頁技術(shù)分配內(nèi)存,以更佳的利用系統(tǒng)的RAM。
linux處理內(nèi)存分配的方法是:創(chuàng)建一系列的內(nèi)存對象池,每個池的內(nèi)存大小事固定的,處理分配請求時,就直接在包含足夠大的內(nèi)存塊中傳遞一個整款給請求者。內(nèi)核只能分配一些預(yù)定義的固定大小的字節(jié)數(shù)組。kmalloc能處理的的最小內(nèi)存塊是32或者64,不大于128KB。
內(nèi)存區(qū)段:
linux內(nèi)核把內(nèi)存分為3個區(qū)段:可用于DMA的內(nèi)存,常規(guī)內(nèi)存以及高端內(nèi)存。kmalloc不能分配高端內(nèi)存。內(nèi)存區(qū)段在mm/page_alloc.c中實現(xiàn)。區(qū)段的初始化在對應(yīng)的arch樹下的mm/init.c中。
后備高速緩存 (lookaside cache)
內(nèi)核中普通對象進行初始化所需的時間超過了對其進行分配和釋放所需的時間,因此不應(yīng)該將內(nèi)存釋放回一個全局的內(nèi)存池,而是將內(nèi)存保持為針對特定目而初始化的狀態(tài)。例如,如果內(nèi)存被分配給了一個互斥鎖,那么只需在為互斥鎖首次分配內(nèi)存時執(zhí)行一次互斥鎖初始化函數(shù)(mutex_init)即可。后續(xù)的內(nèi)存分配不需要執(zhí)行這個初始化函數(shù),因為從上次釋放和調(diào)用析構(gòu)之后,它已經(jīng)處于所需的狀態(tài)中了。
linux2.6中USB和SCSI驅(qū)動程序使用了這種高速緩存,是為一些反復(fù)使用的塊增加某些特殊的內(nèi)存池。后背高速緩存管理也叫slab分配器,相關(guān)函數(shù)和類型在中申明。
slab分配器實現(xiàn)高速緩存具有kmem_cache_t類型。
kmem_cache_t * kmem_cache_create( const char *name, size_t size, size_t align,
unsigned long flags;
void (*constructor)(void*,kmem_cache_t *, unsigned long),
void (*destructor)(void*, kmem_cache_t *, unsigned long));
用于創(chuàng)建一個新的高速緩存對象。
constructor用于初始化新分配的對象,destructor用于清除對象。
一旦某個對象的高速緩存被創(chuàng)建以后,就可以調(diào)用kmem_cache_alloc從中分配內(nèi)存對象。
void * kmem_cache_alloc(kmem_cache_t *cache,int flags);
釋放內(nèi)存對象使用kmem_cache_free
void kmem_cache_free(kmem_cache_t *cache,const void *obj);
在內(nèi)存空間都被釋放后,模塊被卸載前,驅(qū)動程序應(yīng)當(dāng)釋放他的高速緩存。
int kmem_cache_destory(kmem_cache_t *cache);
要檢查其返回狀態(tài),如果失敗,表明莫塊中發(fā)生了內(nèi)存泄露。
基于slab的高速緩存scullc
kmem_cache_t *scullc_cache;
scullc_cache=kmem_cache_creat(“scullc”,scullc_quantum,0,SLAB_HWCACHE_ALIGN,NULL,NULL);
if(!scullc_cache)
{
scullc_cleanup();
return -ENOMEM;
}
if(!dpte->data)
{
dptr->data=kmem_cache_alloc(scullc_cache,GFP_KERNEL);
if(!dptr->data)
goto nomem;
memset(dptr->data,0,scullc_quantum);
}
for(i=0;idata)
kmem_cache_free(scullc_cache,dptr->data);
}
if(scullc_cache)
kmem_cache_destory(scullc_cache);
內(nèi)存池:
內(nèi)核中有些地方的內(nèi)存分配是不允許失敗的,為確保能分配成功,內(nèi)核建立一種稱為內(nèi)存池的抽象,他試圖始終保持空閑狀態(tài),以便緊急情況使用。
mempool_t * mempool_creat(int min_nr,
mempool_alloc_t *alloc_fn, //對象分分配 mempool_alloc_slab
mempool_free_t *free_fn, //釋放 mempool_free_slab
void *pool_data);
可以用如下代碼來構(gòu)造內(nèi)存池
cache=kmem_cache_creat(…); //創(chuàng)建一個高速緩存
pool=mempool_creat(MY_POOL_MINIMUM,mempool_alloc_slab,mempool_free_slab,cache);//建立內(nèi)存池對象
void *mempool_alloc(mempool_t *poll,int gfp_mask);//分配對象
void *mempool_free(void *element,mempool_t *poll);//釋放對象
void mempool_destroy(mempool_t *poll);//銷毀內(nèi)存池
注意:mempool會分配一些內(nèi)存塊,空閑且不會被用到,造成內(nèi)存的大量浪費。所以一般情況不要用內(nèi)存池。
關(guān)于linux 銷毀對象的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營銷公司。廣泛應(yīng)用于計算機網(wǎng)絡(luò)、設(shè)計、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
分享名稱:Linux中銷毀對象的方式及注意事項(linux銷毀對象)
網(wǎng)站URL:http://www.dlmjj.cn/article/cdhpjio.html


咨詢
建站咨詢
