[Unix]file system(총블럭수(클러스터),inode)

gyxor의 이미지

#include<unistd.h>
#include<stdio.h> 
#include<sys/statvfs.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
	struct statvfs fs;
	creat("test",0777);
	statvfs("test",&fs);
        printf("f_bsize   : %d\n",fs.f_bsize);
	printf("f_frsize  : %d\n",fs.f_frsize);
	printf("f_blocks  : %d  512bytes : %d\n",fs.f_blocks,fs.f_blocks*2);
	printf("f_bfree   : %d  512bytes : %d\n",fs.f_bfree,fs.f_bfree*2);
	printf("f_bavail  : %d  512bytes : %d\n",fs.f_bavail,fs.f_bavail*2);
	printf("f_files   : %d\n",fs.f_files);
	printf("f_ffree   : %d\n",fs.f_ffree);
	printf("f_favail  : %d\n",fs.f_favail);
	printf("f_fsid    : %d\n",fs.f_fsid);
	printf("f_flag    : %d\n",fs.f_flag);
	printf("f_namemax : %d\n",fs.f_namemax);
	system("df");
	return 0;
}

이러한 소스를 이용해서 Unix OSF/1 v.4.0d 에서 테스트 해봤습니다.
결과는

f_bsize : 8192 =>I/O buffer 사이즈
f_frsize : 1024 =>블럭사이즈
f_blocks : 4064238 512bytes : 8128476 =>총블럭수
f_bfree : 1462502 512bytes : 2925004 =>free 블럭수
f_bavail : 1056078 512bytes : 2112156 =>일반 프로세스에 할당 가능한 블럭수
f_files : 983038 =>inode 총개수
f_ffree : 923005 =>free inode 개수
f_favail : 923005 =>일반 프로세스에 할당 가능한 inode수
f_fsid : 11534530 =>file system id
f_flag : 0 =>flag
f_namemax : 255 =>file name max length

Filesystem 512-blocks Used Available Capacity Mounted on
/dev/rz24a 581198 296632 226446 57% /
/proc 0 0 0 100% /proc
/dev/rz24g 5991258 4803252 588880 90% /usr
/dev/re1c 8128476 5165648 2149980 71% /xxx1
/dev/re2c 8128476 4480408 2835220 62% /xxx2
/dev/re3c 8128476 5203472 2112156 72% /xxx3
/dev/re4c 8128476 6209898 1105730 85% /xxx4
/dev/re0c 3987326 1508510 2080082 43% /xxx5
/dev/re5c 17241558 11689510 3827892 76% /xxx6
/dev/re6c 17241558 9653654 5863748 63% /xxx7
/dev/re7g 13268536 10432516 1509166 88% /xxx8

위 내용에서 free블럭수와 실제 Available한 값과는 차이가 있습니다.
inode도 마찬가지구요
첫째, 특별한 사용을 위해서 inode와 블럭을 따로 빼놓은거 같은데요
(레드헷 리눅스도 마찬가지였습니다.)
어떤 사용때문에 그런것인지 알고싶습니다.
둘째, flag값은 umask(..)에서 셋팅하는 값이 아닌거 같은데요..
무엇에 쓰이는것인지 모르겠습니다. 설명부탁드립니다.

위 file system 에서는 block 사이즈를 1024 byte로 하고있습니다.
그런데 "df"등의 명령어나 struct stat을 사용해 파일의 st_blocks(블럭수)를
출력해보면 512단위로 끊어서 나오기 때문에 2배값이 나옵니다.
위 출력물에서 Available값이 모두 짝수인 이유가 그것입니다.
여기서 좀 이상한 것이

계속해서 블럭이라는 용어가 나오고 있습니다.
클러스터라는 용어와 헷갈립니다.

__파일처리에 관한 책에서는__
블럭     : 섹터 혹은 섹터의 모임과 동의어로 사용되기도 한다.
클러스터 : 고정된 몇 개의 연속하는 섹터의 집합 이다.
차이를 모르겠습니다.

__Os관련 책에서는__
to allocate the clusters rather than blocks
라는 부분에서 두개의 관계가 나오고있습니다.

__용어사전에선__
블록은 저장장치 상의 일련의 레코드들의 집합이다. 
블록은 처리하는 단위로서 사용되는데, 예를 들어 디스크 드라이브는 
종종 512 바이트를 한 블록으로 해서 데이터를 읽거나, 기록한다. 

클러스터는 하드디스크 그 자체에 만들어지는 물리적인 단위가 아닌 논리적인 
단위이기 때문에, 경우에 따라 클러스터의 크기를 다양하게 설정할 수 있다. 
그러나, 클러스터의 크기가 커지면서 지불해야할 대가가 있다면, 그것은 크기가 
적은 파일들 (예를 들어 디렉토리와 같은 것들) 조차도 하나의 클러스터를 모두 
차지해 버려 낭비적 요소가 있다는 것이다. 그러므로, 만약 클러스터 한개의 크기를 
2,048 바이트로 설정한 경우라면, 10 바이트 짜리 파일조차도 2,048 바이트를 
소모하게 되는 것이다(실제로 많은 운영체계에서 클러스터의 기본 크기를 4,096 
바이트나 8,192 바이트로 설정하고 있다). 

셋째,
모든 내용을 종합해 봤을때
소스상에서나 "df"명령어 상에서 block이라고 하는것은 "클러스터" 라고 생각됩니다.
블록과 클러스터의 차이점 설명부탁드립니다.

넷째,

unix에서 블록의 구성은
블록 0 : bootstrap block
블록 1 : Super block
블록 2-n : inode block
블록 n+1 - ...: data block
이렇게 이뤄진다고 나와았습니다.
indexed 지정방식이므로
inode 블록안에는 해당 파일의
mode값 , 위치하는 블록 index 등이 나옵니다.
그런데 inode block의 사이즈는 64bytes 또는 128bytes 라고 하는데요
inode한개당 블럭하나를 사용하는것은 확실한데요
그렇다면 지금처럼 블럭사이즈가 1024인경우엔 inode가 128바이트라고 하더라도
896bytes가 낭비되는데요
저의 계정이 속해있는 파일 시스템에선 inode총 개수가
983038개 였으므로 곱하기 896을 하면 약 840Mbyte가 낭비가 됩니다.
파일시스템 전체로하면 어마어마한 양이되는데요..
실제로 이렇게 사용되고 있나요?
아니면 inode block에 한해서만 예외적으로 사이즈를 64bytes 나 128byte2로
설정하고 있나요?

다섯째,
마찬가지 개념으로 디렉토리 파일의 경우에 사이즈는 512로 고정되어 있었습니다.
빈공간이 512bytes가 생기는데요.. 왜 이렇게 설정이 되어있는지 궁금합니다.

질문양이 많아서 죄송합니다.
다섯가지질문 답변부탁드립니다.

cjh의 이미지

statfs나 statvfs 매뉴얼 페이지를 보세요.

그리고 파일시스템 구성은 OS에서 사용하는 파일시스템 종류에 따라 많이 다릅니다. OSF/1이라면 UFS나 AdvFS이므로, 해당 OS에서 제공하는 책자나(OSF/1이라면 매뉴얼이 책장 하나 정도 제공될 겁니다) Vahalia의 "Unix Internals"같은 책에 잘 설명되어 있습니다.

--
익스펙토 페트로눔

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.