❶ linux盤啟動時候出現這個提示 can not mount /dev/loop1 on /cow
1/dev/loop1應該是一個虛擬設備.
所以個人認為你的grub.conf里的參數應該是配置錯誤的.
2隻要把U盤掛在別的正常系統上之後,然把軟體對應的所有文件保持目的結構,
以及配置文件COPY出來.並做相應的修改即可.
不過,個人覺得,這是一個大工程.無實際操作的意義.
❷ Linux中的零拷貝技術
參考文章: 淺析Linux中的零拷貝技術
內核和用戶空間,共享內存。數據到內核區後,只需要把地址共享給應用程序即可,無需再一次數據到用戶空間。
優點:
缺點:
應用:
kafka生產者發送消息到broker的時候,broker的網路接收到數據後,到broker的內核空間。然後通過mmap技術,broker會修改消息頭,添加一些元數據。所以,寫入數據很快。當然順序IO也是關鍵技術
內核直接發送數據到socket,無需用戶空間參與。
優點:
缺點:
為了節省內核裡面的一次,我們可以使用優化過的sendfile。該系統方法需要由特定的硬體來支持,並不是所有系統都支持。如下:
sendfile的時候,直接把內核空間的地址傳遞給socket緩存,DMA直接從指定地址讀取數據到流裡面。
sendfile只適用於將數據從文件拷貝到套接字上,限定了它的使用范圍。Linux在2.6.17版本引入splice系統調用,用於在兩個文件描述符中移動數據。
splice調用在兩個文件描述符之間移動數據,而不需要數據在內核空間和用戶空間來回拷貝。他從fd_in拷貝len長度的數據到fd_out,但是有一方必須是管道設備,這也是目前splice的一些局限性。flags參數有以下幾種取值:
splice調用利用了Linux提出的管道緩沖區機制, 所以至少一個描述符要為管道。
以上幾種零拷貝技術都是減少數據在用戶空間和內核空間拷貝技術實現的,但是有些時候,數據必須在用戶空間和內核空間之間拷貝。這時候,我們只能針對數據在用戶空間和內核空間拷貝的時機上下功夫了。Linux通常利用寫時復制( on write)來減少系統開銷,這個技術又時常稱作COW。
摘錄網上:
傳統的fork()系統調用直接把所有的資源復制給新創建的進程。這種實現過於簡單並且效率低下,因為它拷貝的數據也許並不共享,更糟的情況是,如果新進程打算立即執行一個新的映像,那麼所有的拷貝都將前功盡棄。Linux的fork()使用寫時拷貝(-on-write)頁實現。寫時拷貝是一種可以推遲甚至免除拷貝數據的技術。內核此時並不復制整個進程地址空間,而是讓父進程和子進程共享同一個拷貝。只有在需要寫入的時候,數據才會被復制,從而使各個進程擁有各自的拷貝。也就是說,資源的復制只有在需要寫入的時候才進行,在此之前,只是以只讀方式共享。這種技術使地址空間上的頁的拷貝被推遲到實際發生寫入的時候。在頁根本不會被寫入的情況下—舉例來說,fork()後立即調用exec()—它們就無需復制了。fork()的實際開銷就是復制父進程的頁表以及給子進程創建惟一的進程描述符。在一般情況下,進程創建後都會馬上運行一個可執行的文件,這種優化可以避免拷貝大量根本就不會被使用的數據(地址空間里常常包含數十兆的數據)。由於Unix強調進程快速執行的能力,所以這個優化是很重要的。這里補充一點:Linux COW與exec沒有必然聯系。
我總結下: -on-write技術其實是一種延遲復制的技術,只有需要用(寫)的時候,才去復制數據。
❸ linux進程、線程及調度演算法(二)
執行一個 ,但是只要任何修改,都造成分裂如,修改了chroot,寫memory,mmap,sigaction 等。
p1 是一個 task_struct, p2 也是一個 task_struct. linux內核的調度器只認得task_struck (不管你是進程還是線程), 對其進行調度。
p2 的task_struck 被創建出來後,也有一份自己的資源。但是這些資源會短暫的與p1 相同。
進程是區分資源的單位,你的資源是我的資源,那從概念上將就不叫進程。
其他資源都好分配,唯一比較難的是內存資源的重新分配。
非常簡單的程序,但是可以充分說明 COW。
結果:10 -> 20 -> 10
COW 是嚴重依賴於CPU中的MMU。CPU如果沒有 MMU,fork 是不能工作的。
在沒有mmu的CPU中,不可能執行COW 的,所以只有vfork
vfork與fork相比的不同
P2沒有自己的 task_struct, 也就是說P1 的內存資源 就是 P2的內存資源。
結果 10,20,20
vfork:
vfork 執行上述流程,P2也只是指向了P1的mm,那麼將這個vfork 放大,其餘的也全部clone,共同指向P1,那麼就是線程的屬性了。
phtread_create -> Clone()
P1 P2 在內核中都是 task_struct. 都可以被調度。共享資源可調度,即線程。 這就是線程為什麼也叫做輕量級進程
不需要太糾結線程和進程的區別。
4651 : TGID
4652, 4653 tid 內核中 task_struct 真正的pid
linux 總是白發人 送 黑發人。如果父進程在子進程推出前掛掉了。那麼子進程應該怎麼辦?
p3 -> init, p5 -> subreaper
每一個孤兒都會找最近的火葬場
可以設置進程的屬性,將其變為subreaper,會像1號進程那樣收養孤兒進程。
linux的進程睡眠依靠等待隊列,這樣的機制類似與涉及模式中的訂閱與發布。
睡眠,分兩種
每一個進程都是創建出來的,那麼第一個進程是誰創建的呢?
init 進程是被linux的 0 進程 創建出來的。開機創建。
父進程就是 0 號進程,但在pstree,是看不到0進程的。因為0進程創建子進程後,就退化成了idle進程。
idle進程是 linux內核里,特殊調度類。 所有進程都睡眠停止 ,則調度idle進程,進入到 wait for interrupte 等中斷。此時 cpu及其省電,除非來一個中斷,才能再次被喚醒。
喚醒後的任何進程,從調度的角度上說,都比idle進程地位高。idle是調度級別最最低的進程。
0 進程 一跑,則進入等中斷。一旦其他進程被喚醒,就輪不到 0進程了。
所有進程都睡了,0就上來,則cpu需要進入省電模式
❹ Linux中如何通過設備號找到設備
一個字元設備或者塊設備都有一個主設備號和次設備號。主設備號和次設備號統稱為設備號。主設備號用來表示一個特定的驅動程序。次設備號用來表示使用該驅動程序的各設備。
查看主設備號:
# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
6 lp
7 vcs
10 misc
13 input
14 sound
21 sg
29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
189 usb_device
202 cpu/msr
203 cpu/cpuid
216 rfcomm
249 blkwatch_272
250 hidraw
251 usbmon
252 bsg
253 pcmcia
254 rtc
Block devices:
1 ramdisk
2 fd
259 blkext
7 loop
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
如上所示,該命令會顯示字元設備和塊設備的主設備號。如果你想查看某個主設備號,那麼可以
[root@mylnx01 ~]# cat /proc/devices | grep 253
253 pcmcia
253 device-mapper
其中Device Mapper,Device Mapper 是 Linux 2.6 內核中提供的一種從邏輯設備到物理設備的映射框架機制,在該機制下,用戶可以很方便的根據自己的需要制定實現存儲資源的管理策略,當前比較流行的 Linux 下的邏輯卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基於該機制實現的。
次設備號查看
[root@mylnx01 ~]# ls -l /dev 或 ll /dev[root@mylnx01 ~]# ll /dev | grep 253 | grep -v grep
brw-rw---- 1 root root 253, 0 Jul 17 23:08 dm-0
brw-rw---- 1 root root 253, 1 Jul 17 23:08 dm-1
brw-rw---- 1 root root 253, 2 Jul 17 23:08 dm-2
brw-rw---- 1 root root 253, 3 Jul 17 23:08 dm-3
brw-rw---- 1 root root 253, 4 Jul 17 23:09 dm-4
brw------- 1 root root 253, 1 Jul 17 23:09 root
但是在一台伺服器的日誌信息遇到下面錯誤信息,通過/dev 沒有找到次設備號為253:14的塊設備。 如下所示
Jul 19 05:02:01 mylnx01 kernel: BLKWATCH ERR: Attempt to get a sector index out of the bitmap bounds.
Jul 19 05:02:01 mylnx01 kernel: BLKWATCH ERR: Critical error 1 happened for device 253:14. Additional info: Failed to mark block as dirty.
[root@getlnx01 ~]# ll /dev | grep 253 | grep -v grep
關於次設備號的主要用途,這篇博客主設備號和次設備號介紹了部分內容。
1、區分設備驅動程序控制的實際設備;
2、區分不同用途的設備 (misc 系列設備)
3、區分塊設備的分區 (partition)
通常,為了使應用程序區分所控制設備的類型,內核使用主設備號。而存在多台同類設備時,為了選擇其中的一種,設備驅動程序就使用次設備號。
# ll /dev/ | grep sd #或者命令 ll /dev/ | grep disk
brw-r----- 1 root disk 8, 0 Jul 17 23:08 sda
brw-r----- 1 root disk 8, 1 Jul 17 23:10 sda1
brw-r----- 1 root disk 8, 2 Jul 17 23:08 sda2
brw-r----- 1 root disk 8, 3 Jul 17 23:08 sda3
brw-r----- 1 root disk 8, 16 Jul 17 23:08 sdb
brw-r----- 1 root disk 8, 17 Jul 17 23:08 sdb1
brw-r----- 1 root disk 8, 18 Jul 17 23:08 sdb2
brw-r----- 1 root disk 8, 21 Jul 17 23:08 sdb5
brw-r----- 1 root disk 8, 32 Jul 17 23:08 sdc
brw-r----- 1 root disk 8, 33 Jul 17 23:08 sdc1
brw-r----- 1 root disk 8, 34 Jul 17 23:08 sdc2
brw-r----- 1 root disk 8, 37 Jul 17 23:08 sdc5
brw-r----- 1 root disk 8, 48 Jul 17 23:08 sdd
brw-r----- 1 root disk 8, 49 Jul 17 23:08 sdd1
brw-r----- 1 root disk 8, 50 Jul 17 23:08 sdd2
brw-r----- 1 root disk 8, 51 Jul 17 23:08 sdd3
brw-r----- 1 root disk 8, 53 Jul 17 23:08 sdd5
brw-r----- 1 root disk 8, 64 Jul 17 23:08 sde
brw-r----- 1 root disk 8, 65 Jul 17 23:08 sde1
brw-r----- 1 root disk 8, 66 Jul 17 23:08 sde2
brw-r----- 1 root disk 8, 67 Jul 17 23:08 sde3
brw-r----- 1 root disk 8, 69 Jul 17 23:08 sde5
brw-r----- 1 root disk 8, 80 Jul 17 23:08 sdf
brw-r----- 1 root disk 8, 81 Jul 17 23:08 sdf1
brw-r----- 1 root disk 8, 85 Jul 17 23:08 sdf5
brw-r----- 1 root disk 8, 96 Jul 17 23:08 sdg
brw-r----- 1 root disk 8, 97 Jul 17 23:08 sdg1
brw-r----- 1 root disk 8, 98 Jul 17 23:08 sdg2
brw-r----- 1 root disk 8, 101 Jul 17 23:08 sdg5
brw-r----- 1 root disk 8, 112 Jul 17 23:08 sdh
brw-r----- 1 root disk 8, 113 Jul 17 23:08 sdh1
brw-r----- 1 root disk 8, 117 Jul 17 23:08 sdh5
❺ linux盤啟動時候出現這個提示 can not mount /dev/loop1 on /cow
很顯然/cow是你自己添加的一個文件系統。
/dev/loop1從何而來,你有沒有用命令losetup來添加過設備/dev/loop1。
❻ 雲計算核心技術Docker教程:Docker存儲寫入時復制(CoW)策略
【點擊右上角加'關注',全國產經信息不錯過】
寫時復制是一種共享和復制文件的策略,可最大程度地提高效率。如果文件或目錄位於映像的較低層中,而另一層(包括可寫層)需要對其進行讀取訪問,則它僅使用現有文件。另一層第一次需要修改文件時(在構建映像或運行容器時),將文件復制到該層並進行修改。這樣可以將I / O和每個後續層的大小最小化。這些優點將在下面更深入地說明。
共享可以提升較小的圖像
當您用於docker pull從存儲庫中下拉映像時,或者當您從本地尚不存在的映像中創建容器時,每個層都會被分別下拉,並存儲在Docker的本地存儲區域中,該區域通常/var/lib/docker/在Linux主機上。在此示例中,您可以看到這些層被拉出:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
f476d66f5408: Pull complete
8882c27f669e: Pull complete
d9af21273955: Pull complete
f5029279ec12: Pull complete
Digest: sha256:
Status: Downloaded newer image for ubuntu:18.04
這些層中的每一層都存儲在Docker主機的本地存儲區域內的自己的目錄中。要檢查文件系統上的各層,請列出的內容/var/lib/docker/。本示例使用overlay2 存儲驅動程序:
$ ls /var/lib/docker/overlay2
l
目錄名稱與層ID不對應(自Docker 1.10開始就是如此)。
現在,假設您有兩個不同的Dockerfile。您使用第一個創建名為的圖像acme/my-base-image:1.0。
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
第二acme/my-base-image:1.0層基於,但具有一些附加層:
# syntax=docker/dockerfile:1
FROM acme/my-base-image:1.0
CMD /app/hello.sh
第二個圖像包含第一個圖像的所有層,再加上帶有CMD指令的新層,以及一個可讀寫容器層。Docker已經具有第一個映像中的所有層,因此不需要再次將其拉出。這兩個圖像共享它們共有的任何圖層。
如果從兩個Dockerfile構建映像,則可以使用docker image ls和 docker history命令來驗證共享層的密碼ID是否相同。
1.創建一個新目錄cow-test/並更改到該目錄中。
2.在中cow-test/,創建一個hello.sh具有以下內容的新文件:
#!/bin/sh
echo "Hello world"
保存文件,並使其可執行:
chmod +x hello.sh
3.將上面第一個Dockerfile的內容復制到一個名為的新文件中 Dockerfile.base。
4.將上面第二個Dockerfile的內容復制到一個名為的新文件中 Dockerfile。
5.在cow-test/目錄中,構建第一個映像。不要忘記.在命令中包含final 。設置了PATH,它告訴Docker在哪裡尋找需要添加到映像中的任何文件。
$docker build -t acme/my-base-image:1.0 -f Dockerfile.base .
6.建立第二張鏡像。
$docker build -t acme/my-final-image:1.0 -f Dockerfile .
7.檢查鏡像的大小:
$docker image ls
8.檢出構成每個鏡像的圖層:
$docker history bd09118bcef6
請注意,除了第二個圖像的頂層以外,所有層都是相同的。所有其他層在兩個圖像之間共享,並且僅在中存儲一次/var/lib/docker/。實際上,新層根本不佔用任何空間,因為它不更改任何文件,而僅運行命令。
全國產經平台聯系電話:010-65367702,郵箱:[email protected],地址:北京市朝陽區金台西路2號人民日報社
❼ linux下的命令都是干什麼用的
前三個和最後一個是兩個類型。前三個主要是Linux用來創建新的進程(線程)而設計的,exec()系列函數則是用來用指定的程序替換當前進程的所有內容。所以exec()系列函數經常在前三個函數使用之後調用,來創建一個全新的程序運行環境。Linux用init進程啟動其他進程的過程一般都是這樣的。
下面說fork、vfork和clone三個函數。這三個函數分別調用了sys_fork、sys_vfork、sys_clone,最終都調用了do_fork函數,差別在於參數的傳遞和一些基本的准備工作不同。可見這三者最終達到的最本質的目的都是創建一個新的進程。在這里需要明確一下,Linux內核中沒有獨立的「線程」結構,Linux的線程就是輕量級進程,換言之基本控制結構和Linux的進程是一樣的(都是通過struct task_struct管理)。
fork是最簡單的調用,不需要任何參數,僅僅是在創建一個子進程並為其創建一個獨立於父進程的空間。fork使用COW(寫時拷貝)機制,並且COW了父進程的棧空間。
vfork是一個過時的應用,vfork也是創建一個子進程,但是子進程共享父進程的空間。在vfork創建子進程之後,父進程阻塞,直到子進程執行了exec()或者exit()。vfork最初是因為fork沒有實現COW機制,而很多情況下fork之後會緊接著exec,而exec的執行相當於之前fork復制的空間全部變成了無用功,所以設計了vfork。而現在fork使用了COW機制,唯一的代價僅僅是復制父進程頁表的代價,所以vfork不應該出現在新的代碼之中。在Linux的manpage中隊vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux為創建線程設計的(雖然也可以用clone創建進程)。所以可以說clone是fork的升級版本,不僅可以創建進程或者線程,還可以指定創建新的命名空間(namespace)、有選擇的繼承父進程的內存、甚至可以將創建出來的進程變成父進程的兄弟進程等等。clone和fork的調用方式也很不相同,clone調用需要傳入一個函數,該函數在子進程中執行。此外,clone和fork最大不同在於clone不再復制父進程的棧空間,而是自己創建一個新的。
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
❽ linux酷炫的命令怎麼安裝
桌面環境是充滿魅力,吸引眼球的。不僅增強了視覺體驗,而且在某些情況下能增強軟體的功能,增添趣味。其實在命令行下工作也並不總是那麼單調乏味。如果你想在命令行下獲取幾分樂趣的話,自然也是有很多命令可以令你泛起微笑。
Linux是一個充滿樂趣的操作系統。 功能各異,顯而易見到奇秒神奇的巨大開源小工具集被Linux所提供。正是由於這些高質量可選擇工具令Linux脫穎而出。來看看下面這7個小工具。
Lolcat
Lolcat是一個能連接文件或者標准輸入,並將其內容輸出到標准輸出的程序(像是一般的cat),但是它能給文字賦予美麗的彩虹。Lolcat常常與諸如toilet和figlet的之類的其他工具組合起來生成文字。
開發者:Lolcat由Moe開發。
站點:github.com。
Cowsay
Cowsay是一個可配置的開源程序,它能夠產生一幅由ASCII字元組成的一頭奶牛和一個會話氣泡圖像。由Perl語言編寫的cowsay不僅僅局限於產生奶牛的圖像,它也能產生預先生成的其他動物圖像,如鴨子,大象,考拉,駝鹿,小馬,綿羊,劍龍和火雞等。還有非動物的棋子,雪人和一個骨架。
有一個和這個相關的程序叫做cowthink,它生成的是一頭奶牛和它思考的氣泡,而不是像cowsay生成的是會話氣泡。
特點:
令腳本程序更加有趣。
博格模式。
可改變奶牛的面貌,比如讓它看起來貪婪,偏執,冷酷,疲憊,年輕等等。
站點:nog.net。
Doge
Doge是一個基於略顯愚蠢實則非常有趣的柴犬圖的簡單motd腳本。它隨機的列印一些語法不正確的語句,有時這些相關語句來源於你的計算機。
Doge是一個在2013年流行起來的網路模因。該模因通常由柴犬的圖片配上ComicSans字體的五彩文字。這些文字是一種內心的獨白,並且還故意使用蹩腳英語。
特點:
文字出現的位置與顏色隨機,故意使用了蹩腳英語。
能抓取系統數據,如主機名,運行中的進程,最近的用戶和編輯器等。
如果你有lolcat,你可以試試這樣:whiletrue;dodoge|lolcat-a-d100-s100-p1;done
支持標准輸入:ls/usr/bin|doge將會以doge樣式列印出在/usr/bin目錄下找到的一些可執行程序。哇哦!這還能用來統計你頻繁使用哪些命令。
站點:github.com/thiderman/doge。
ASCIIQuarium
ASCIIQuarium是一個用ASCII字元藝術表達的水族館或大海的動漫。盡情的欣賞你計算機中那些在水中游動的美麗生物吧!
你需要安裝Perl的curses包和Term::Animation模塊來支持ASCIIQuarium的運行。終端執行:sudoapt-getinstalllibcurses-perl和sudocpanTerm::Animation即可安裝上述兩個依賴。
特點:
色彩斑斕的魚。
有趣的動漫,還有一個魚鉤。
有天鵝,鴨子,海豚和船。
站點:www.robobunny.com。
Sl–StremLocomotive
Sl是一個有趣的命令行工具,他通過一個火車開過的動畫來糾正用戶偶然把ls輸錯成sl。
我相當疏忽命令輸入的過程的正確性,我更願意追求速度。但這可能會造成危險。因此sl可以很好的在我發生這些錯誤時提醒我。
特點:
-F開關,控制火車文件。
-l開關,顯示一個小火車。
-a開關,似乎會發生一場事故。
站點:github.com/mtoyoda/sl。
Aafire
Aafire在終端展現的是一個燃燒中的ASCII字元構成的火焰。它展現的是一個ascii顯示庫aalib的功能。
站點:aa-project.sourceforge.net/aalib。
CMatrix
CMatrix是一個ncurses庫程序,模擬「黑客帝國」中的一個畫面。如果你看過「黑客帝國」這部電影,那麼你就會知道。
它工作在132×300大小的終端中,可以進行同步或非同步速率的翻滾,還可用戶自定義速率。
特點:
改變文本的顏色。
使用粗體字元。
非同步翻滾。
老式風格翻滾。
「屏幕保護」模式。
站點:www.asty.org/cmatrix。
這里有幾個你可以先看下,你也要學習些基本的命令網頁鏈接。