UNIX文件系統(tǒng)

2018-11-24 15:12 更新

權(quán)限

用 chmod 和 chown 更改訪問權(quán)限和所有權(quán)。對(duì)于所有用戶的默認(rèn)掩碼(umask)可以在 /etc/profile (Linux) 或 /etc/login.conf (FreeBSD) 中修改。其默認(rèn)掩碼(umask)通常為 022。掩碼可以和777做減法,從而得到755的權(quán)限。

1 --x 執(zhí)行                           
# Mode 764 = 執(zhí)行/讀/寫 | 讀/寫 | 讀2 -w- 寫                             
# |---所有者|---用戶組|---其他用戶|4 r-- 讀
  ugo=a                              u=所有者, g=用戶組, o=其他用戶, a=所有用戶

# chmod [OPTION] MODE[,MODE] FILE    
# MODE 可以是 [ugoa]*([-+=]([rwxXst]))
# chmod 640 /var/log/maillog         
# 更改 maillog 訪問權(quán)限為 -rw-r-----
# chmod u=rw,g=r,o= /var/log/maillog 
# 同上
# chmod -R o-r /home/*               
# 遞歸去除所有其他用戶的可讀權(quán)限
# chmod u+s /path/to/prog            
# 在可執(zhí)行位設(shè)置 SUID (知道你在干什么!)
# find / -perm -u+s -print           
# 查找所有設(shè)置過 SUID 位的程序
# chown user:group /path/to/file     
# 改變文件的所有者和文件關(guān)聯(lián)的組
# chgrp group /path/to/file          
# 改變文件關(guān)聯(lián)的組# chmod 640 `find ./ -type f -print` 
# Change permissions to 640 for all files# chmod 751 `find ./ -type d -print` 
# Change permissions to 751 for all directories

磁盤信息

# diskinfo -v /dev/ad2               
# 顯示磁盤信息(扇區(qū)/大小) (FreeBSD)
# hdparm -I /dev/sda                 
# 顯示 IDE/ATA 磁盤信息 (Linux)
# fdisk /dev/ad2                     
# 顯示和修改磁盤分區(qū)表
# smartctl -a /dev/ad2               
# 顯示磁盤檢測(cè)信息

Boot

FreeBSD

如果新內(nèi)核不能引導(dǎo),要引導(dǎo)一個(gè)舊內(nèi)核,停止啟動(dòng)倒計(jì)時(shí),做如下動(dòng)作:

# unload
# load kernel.old
# boot

系統(tǒng)掛載點(diǎn)/磁盤使用情況

# mount | column -t                  
# 顯示系統(tǒng)已掛載分區(qū)情況
# df                                 
# 顯示磁盤剩余空間和掛載的設(shè)備
# cat /proc/partitions               
# 顯示所有設(shè)備的所有分區(qū)(Linux)

磁盤使用情況

# du -sh *                           
# 列出當(dāng)前目錄下所有文件夾大小
# du -csh                            
# 當(dāng)前目錄下所有目錄大小總數(shù)
# du -ks * | sort -n -r              
# 由大到小排序顯示目錄大小
# ls -lSr                            
# 由小到大顯示文件列表

誰打開了那些文件

對(duì)于找出哪些文件阻止卸載分區(qū)并給出有代表性的錯(cuò)誤是有幫助的:

# umount /home/
umount: unmount of /home             
# 不能卸載,因?yàn)橛幸粋€(gè)文件鎖定了 home
   failed: Device busy

FreeBSD 和大多數(shù) Unix

# fstat -f /home                     
# 對(duì)于一個(gè)掛載點(diǎn)# fstat -p PID                       
# 對(duì)于一個(gè)應(yīng)用程序進(jìn)程 ID# fstat -u user                      
# 對(duì)于一個(gè)用戶

查找已打開日志文件(或其他已打開文件), 比如 Xorg:

# ps ax | grep Xorg | awk '{print $1}'
1252
# fstat -p 1252
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
root     Xorg        1252 root /             2 drwxr-xr-x     512  r
root     Xorg        1252 text /usr     216016 -rws--x--x  1679848 r
root     Xorg        1252    0 /var     212042 -rw-r--r--   56987  w

在 /var 中的只有一個(gè) inum 為 212042 的文件:

# find -x /var -inum 212042
/var/log/Xorg.0.log

Linux

使用 fuser 或 lsof 在一個(gè)掛載點(diǎn)中查找已打開的文件:

# fuser -m /home                     
# 列出訪問 /home 的進(jìn)程
# lsof /home
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE     NODE NAME
tcsh    29029 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
lsof    29140 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)

關(guān)于一個(gè)應(yīng)用程序:

ps ax | grep Xorg | awk '{print $1}'
3324
# lsof -p 3324
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE    NODE NAME
Xorg    3324 root    0w   REG        8,6   56296      12492 /var/log/Xorg.0.log

關(guān)于單個(gè)文件:

# lsof /var/log/Xorg.0.log
COMMAND  PID USER   FD   TYPE DEVICE  SIZE  NODE NAME
Xorg    3324 root    0w   REG    8,6 56296 12492 /var/log/Xorg.0.log

掛載/重掛載一個(gè)文件系統(tǒng)

舉個(gè) cdrom 的例子。如果已經(jīng)列于 /etc/fstab 中:

# mount /cdrom

或在 /dev/ 中查找設(shè)備,亦或使用 dmesg 命令

FreeBSD

# mount -v -t cd9660 /dev/cd0c /mnt  
# cdrom# mount_cd9660 /dev/wcd0c /cdrom     
# 另外一個(gè)方法# mount -v -t msdos /dev/fd0c /mnt   
# 軟驅(qū)

/etc/fstab 中的一條:

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0

要允許用戶做這些,可以這么做:

# sysctl vfs.usermount=1  # 或者在 /etc/sysctl.conf 中插入一條 "vfs.usermount=1"

Linux

# mount -t auto /dev/cdrom /mnt/cdrom   
# 典型的 cdrom 掛載命令
# mount /dev/hdc -t iso9660 -r /cdrom  
# IDE
# mount /dev/sdc0 -t iso9660 -r /cdrom  # SCSI

/etc/fstab 中的條目:

/dev/cdrom   /media/cdrom  subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0

用 Linux 掛載一個(gè) FreeBSD 分區(qū)

用 fdisk 查找分區(qū)號(hào),這通常是 root 分區(qū),但也可能是其他 BSD slice。如果 FreeBSD 有許多 slice,他們不列于同一個(gè) fdisk 分區(qū)表中,但可見于 /dev/sda 或 /dev/hda 中。

# fdisk /dev/sda                     
# 查找 FreeBSD 分區(qū)/dev/sda3   *        5357        7905    20474842+  a5  FreeBSD
# mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt
/dev/sda10 = /tmp; /dev/sda11 /usr   
# 其他 slice

重掛載

不用卸載一個(gè)設(shè)備來重掛載。 對(duì) fsck 來說是必須的。舉個(gè)例子:

# mount -o remount,ro /              
# Linux# mount -o ro /                      
# FreeBSD

從 cdrom 拷貝原始數(shù)據(jù)進(jìn)一個(gè) iso 映像文件:

# dd if=/dev/cd0c of=file.iso

給即時(shí)燒錄(on-the-fly)添加 swap

假設(shè)你需要很多的 swap (即刻),如一個(gè) 2GB 文件 /swap2gb (只限 Linux)。

# dd if=/dev/zero of=/swap2gb bs=1024k count=2000
# mkswap /swap2gb                    
# 創(chuàng)建交換區(qū)
# swapon /swap2gb                    
# 激活這個(gè) swap?,F(xiàn)在可以使用了
# swapoff /swap2gb                   
# 當(dāng)使用完畢,釋放這個(gè) swap
# rm /swap2gb

掛載一個(gè) SMB 共享

假設(shè)我們要訪問計(jì)算機(jī) smbserver 上的名叫 myshare 的 SMB 共享,在 window PC 上鍵入的地址是 \smbserver\myshare\。我掛載到 /mnt/smbshare 上。注意 cifs 必須是 IP 或 DNS 名,不是 Windows 名字。

Linux

# smbclient -U user -I 192.168.16.229 -L //smbshare/    
# 列出共享
# mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
# mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share

此外,mount.cifs 軟件包可以存儲(chǔ)認(rèn)證到一個(gè)文件中。例如,/home/user/.smb:

username=winuser
password=winpwd

現(xiàn)在可以像下面那樣掛載:

# mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare

FreeBSD

使用 -I 來獲取 IP (或 DNS 名);smbserver 是 Windows 名。

# smbutil view -I 192.168.16.229 //winuser@smbserver    
# 列出共享
# mount_smbfs -I 192.168.16.229 //winuser@smbserver/myshare /mnt/smbshare

掛載鏡像文件

Linux loop-back

# mount -t iso9660 -o loop file.iso /mnt                
# 掛載 CD 鏡像文件
# mount -t ext3 -o loop file.img /mnt                   
# 用 ext3 文件系統(tǒng)掛載鏡像文件

FreeBSD

用于存儲(chǔ)設(shè)備 (如果需要做 # kldload md.ko 動(dòng)作):

# mdconfig -a -t vnode -f file.iso -u 0
# mount -t cd9660 /dev/md0 /mnt
# umount /mnt; mdconfig -d -u 0                         
# 清除 md 設(shè)備

用于虛擬節(jié)點(diǎn):

# vnconfig /dev/vn0c file.iso; mount -t cd9660 /dev/vn0c /mnt
# umount /mnt; vnconfig -u /dev/vn0c                    
# 清除 vn 設(shè)備

Solaris and FreeBSD

用于 loop-back 文件接口或 lofi:

# lofiadm -a file.iso
# mount -F hsfs -o ro /dev/lofi/1 /mnt
# umount /mnt; lofiadm -d /dev/lofi/1                   
# 清除 lofi 設(shè)備

創(chuàng)建并刻錄 ISO 鏡像文件

這將會(huì)拷貝 CD 或者 DVD 的扇區(qū)。當(dāng)不用 conv=notrunc,鏡像文件會(huì)等于 CD 內(nèi)容大小而非 CD 容量大小??聪旅婧?nbsp;dd 例子。

# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc

使用 mkisofs 把目錄中所有文件創(chuàng)建成 CD/DVD 鏡像文件。克服文件名限制:-r 開啟 Rock Ridge 擴(kuò)展用于 Unix 系統(tǒng),-J 開啟 Joliet 擴(kuò)展用于微軟系統(tǒng)。-L 允許 ISO9660 文件名第一個(gè)字符為句點(diǎn)。

# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir

對(duì)于 FreeBSD,mkisofs 可以到 port 的 sysutils/cdrtools 中找到。

刻錄 ISO 鏡像文件

FreeBSD

FreeBSD 默認(rèn)情況下沒有在 ATAPI 驅(qū)動(dòng)上啟用 DMA。DMA 可用 sysctl 命令啟用,其參數(shù)如下,或者在 /boot/loader.conf 中添加如下條目:

hw.ata.ata_dma="1"
hw.ata.atapi_dma="1"

burncd 用于 ATAPI 驅(qū)動(dòng)(burncd 為基本系統(tǒng)的一部分),cdrecord (在 sysutils/cdrtools 中)用于 SCSI 驅(qū)動(dòng)。

# burncd -f /dev/acd0 data imagefile.iso fixate      
# ATAPI 驅(qū)動(dòng)
# cdrecord -scanbus                  
# 查找 burner 設(shè)備描述符(如 1,0,0)
# cdrecord dev=1,0,0 imagefile.iso

Linux

對(duì)于 Linux,同樣使用 cdrecord 如上文所述。此外,它還可以使用本地 ATAPI 接口查找設(shè)備描述符:

# cdrecord dev=ATAPI -scanbus

然后同上面一樣燒錄 CD/DVD。

dvd+rw-tools

dvd+rw-tools 工具包(FreeBSD: ports/sysutils/dvd+rw-tools)可以做上面的一切,其還包括 growisofs 工具來刻錄 CD 或 DVD。本實(shí)例所引用的 DVD 設(shè)備 /dev/dvd 可能是指向/dev/scd0 (Linux)的符號(hào)連接,或者 /dev/cd0 (FreeBSD),或者 /dev/rcd0c (NetBSD/OpenBSD),或者 /dev/rdsk/c0t1d0s2 (Solaris)。對(duì)于本實(shí)例 FreeBSD 手冊(cè) 18.7 章 上有一份很好的文檔。

# -dvd-compat 選項(xiàng)將完結(jié)光盤,光盤便不可再附加數(shù)據(jù)
# growisofs -dvd-compat -Z /dev/dvd=imagefile.iso     
# 刻錄已存在的 iso 鏡像文件
# growisofs -dvd-compat -Z /dev/dvd -J -R /p/to/data  
# 直接刻錄

轉(zhuǎn)換 Nero .nrg 文件成 .iso

Nero 簡(jiǎn)單的添加了 300KB 的頭到一個(gè)常規(guī)的 iso 鏡像文件中。我們可用 dd 工具來去除它。

# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300

轉(zhuǎn)換 bin/cue 鏡像成 .iso

bchunk 程序可以做到這一點(diǎn)。在 FreeBSD 中,它在 port 的 sysutils/bchunk 中。

# bchunk imagefile.bin imagefile.cue imagefile.iso

創(chuàng)建基于文件的鏡像文件

舉個(gè)例子,一個(gè)使用文件 /usr/vdisk.img 的 1GB 分區(qū)。這里我們使用 vnode 0,但也可為 1。

FreeBSD

# dd if=/dev/random of=/usr/vdisk.img bs=1K count=1M
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0         
# 創(chuàng)建設(shè)備 /dev/md1# bsdlabel -w /dev/md0
# newfs /dev/md0c
# mount /dev/md0c /mnt
# umount /mnt; mdconfig -d -u 0; rm /usr/vdisk.img    
# 清除 md 設(shè)備

這個(gè)基于文件的鏡像文件可以在 /etc/rc.conf 和 /etc/fstab 中配置成啟動(dòng)期間自動(dòng)掛載??捎?nbsp;# /etc/rc.d/mdconfig start (先用 # mdconfig -d -u 0 命令刪除 md0 設(shè)備) 測(cè)試你的設(shè)置。
需要注意的是,那個(gè)自動(dòng)設(shè)置僅工作于這個(gè)基于文件的鏡像文件不在 root 分區(qū)中。原因是 /etc/rc.d/mdconfig 腳本早于啟動(dòng)就執(zhí)行了,并且 root 分區(qū)仍然是只讀的。腳本 /etc/rc.d/mdconfig2 之后,鏡像文件將位于 root 分區(qū)外掛載。
/boot/loader.conf:

md_load="YES"

/etc/rc.conf:

# mdconfig_md0="-t vnode -f /usr/vdisk.img"          
# /usr 不在 root 分區(qū)中

/etc/fstab: (行后的兩個(gè) 0 0 很重要,它告訴 fsck 忽略這個(gè)設(shè)備,現(xiàn)在還不存在。)

/dev/md0                /usr/vdisk      ufs     rw              0       0

也可能在增加鏡像文件的大小之后,如增大到 300MB。

# umount /mnt; mdconfig -d -u 0
# dd if=/dev/zero bs=1m count=300 >> /usr/vdisk.img
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0
# growfs /dev/md0
# mount /dev/md0c /mnt                                
# 文件分區(qū)現(xiàn)在為 300MB

Linux

# dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024
# mkfs.ext3 /usr/vdisk.img
# mount -o loop /usr/vdisk.img /mnt
# umount /mnt; rm /usr/vdisk.img                      
# 清楚

Linux with losetup

/dev/zero 比 urandom 更快,但對(duì)于加密來說卻不夠安全。

# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024
# losetup /dev/loop0 /usr/vdisk.img                   
# 創(chuàng)建并聯(lián)結(jié) /dev/loop0# mkfs.ext3 /dev/loop0
# mount /dev/loop0 /mnt
# losetup -a                                          
# 查看已經(jīng)掛載的 loop 設(shè)備# umount /mnt
# losetup -d /dev/loop0                               
# Detach# rm /usr/vdisk.img

創(chuàng)建基于內(nèi)存的文件系統(tǒng)

基于內(nèi)存的文件系統(tǒng)對(duì)于重量級(jí) IO 應(yīng)用程序來說非??臁T鯓觿?chuàng)建一個(gè)掛載到 /memdisk 的 64M 分區(qū):

FreeBSD

# mount_mfs -o rw -s 64M md /memdisk
# umount /memdisk; mdconfig -d -u 0                   
# 清除該 md 設(shè)備md     /memdisk     mfs     rw,-s64M    0   0         
# /etc/fstab 條目

Linux

# mount -t tmpfs -osize=64m tmpfs /memdisk

磁盤性能

在 ad4s3c (/home) 分區(qū)上讀寫一個(gè) 1GB 的文件。

# time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
# time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
# hdparm -tT /dev/hda      
# 僅限 Linux
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)