Linux下擷取儲存介質扇區大小

來源:互聯網
上載者:User

通過proc檔案系統獲得,在proc檔案系統中有一個名為partitions的檔案。這個檔案中包含本地磁碟的硬碟及分區信 息。根據Linux下裝置命名規則,如果裝置名稱的最後一個字元是數字就應該是分區,否則就是硬碟。 根據這個檔案,還可以知道硬碟裝置名稱以及每個硬碟中分區的數量和每個分區的裝置名稱。

    擷取硬碟扇區大小資訊:

/* get size in bytes */

int
blkdev_get_size(int fd, unsigned long long *bytes)
{
    unsigned long size;
    int ver = get_linux_version();
    /* kernels 2.4.15-2.4.17, had a broken BLKGETSIZE64 */
    if (ver >= KERNEL_VERSION (2,6,0) ||
       (ver >= KERNEL_VERSION (2,4,18) && ver < KERNEL_VERSION (2,5,0))) {
        if (ioctl(fd, BLKGETSIZE64, bytes) >= 0)
            return 0;
    }
    if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
        *bytes = ((unsigned long long)size << 9);
        return 0;
    }
    return -1;

}

根據ATA8-ACS文檔規範,我們的作業系統都會有一個ATA IDENTIFY DEVICE的資料結構來說明一個磁碟裝置的,無論linux還是windows都會有一個,在這裡我以linux為例說明,windows也一樣可用API擷取。
在linux下:

unsigned short word106 = 0;
struct hd_driveid id;
int fd = open(diskname, O_RDONLY);
ioctl(fd, HDIO_GET_IDENTITY, &id);
word106 = id.words104_125[2];

擷取這個結構的第106個字(注意是字,不是位元組)。而這個字就定義了磁碟扇區的大小,我們來看下這個字是怎麼定義扇區大小的。
bit 15 固定為0。
bit 14 固定為1。
bit 13 如果為1就說明一個邏輯扇區有多個物理扇區組成。
bit 12 如果為1就說明裝置被格式化成一個邏輯扇區的大小超過256個字。
bit 11-4 為保留。
bit 3-0 如果bit 13為1的話,這三個位元位就用來表示邏輯扇區的大小。
我們重點看下這前4個位元位是怎麼表示扇區大小的。我用個公式來表示,sector_size = 2^x * 物理扇區大小(即512b)。
即是說邏輯扇區大小是2的x次方個物理扇區的大小,即是:扇區大小 = 2^x * 512。x就是這個字的前4位的值。
舉個例來說,如果是個大扇區,扇區大小為4K即是4096個位元組,那麼在這個字中的表示為:
bit 13 = 1
bit 3-0 = 0011
位元0011 = 十進位數3,那麼2的三次方為8,那麼扇區大小是8*512,即4096 bytes。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.