Экран должен хорошо работать. Предоставьте больше подробную информацию о том, что Вы делаете. Общие команды:
# reattach session and if necessary detach it first.
# If there is only one session, sessionname is not necessary.
$ screen -rd sessionname
# list available screen sessions
$ screen -ls
Я не уверен, почему Вы используете
$ screen -d
Все это делает отсоединить экранную сессию, если существует только один. Иначе это спросит, какой Вы хотите отсоединить.
Я также нахожу
$ echo $TERM
полезный, чтобы показать, являюсь ли я на самом деле в экране или нет, так как это не всегда очевидно. Если на экране, это возвратится screen
. Если бы существуют лучшие способы сделать это, я хотел бы знать о них.
fdisk
не понимает расположение раздела, используемое моим Mac, запускающим Linux, ни любой другой некомпьютерный формат раздела. (Да, существует mac-fdisk
для старых таблиц разделов Mac, и gdisk
для более новой таблицы разделов GPT, но это не единственные другие разметки раздела там.)
Так как ядро уже просканировало разметки раздела, когда блочное устройство поступило в эксплуатацию, почему бы не спросить это непосредственно?
$ cat /proc/partitions major minor #blocks name 8 16 390711384 sdb 8 17 514079 sdb1 8 18 390194752 sdb2 8 32 976762584 sdc 8 33 514079 sdc1 8 34 976245952 sdc2 8 0 156290904 sda 8 1 514079 sda1 8 2 155774272 sda2 8 48 1465138584 sdd 8 49 514079 sdd1 8 50 1464621952 sdd2
/sys/block/sda/size
в размере блока? Раз так, который?
ioctl BLKGETSIZE имеет ту же проблему, как это находится в единицах 512, а не BLKSSZGET. BLKGETSIZE64 решает эту неоднозначность. Реальное количество блока является BLKGETSIZE64/BLKSSZGET.
/*BINFMTC:
http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <assert.h>
int main(int argc, char **argv)
{
int fd;
long blk=0L;
long ssz=0L;
long long oct=0LL;
if((fd=open(argv[1],O_RDONLY))<0) { perror(argv[1]); exit(1); }
if(ioctl(fd,BLKGETSIZE,&blk)<0) { perror("BLKGETSIZE"); exit(1); }
if(ioctl(fd,BLKSSZGET,&ssz)<0) { perror("BLKSSZGET"); exit(1); }
if(ioctl(fd,BLKGETSIZE64,&oct)<0) { perror("BLKGETSIZE64"); exit(1); }
if(close(fd)<0) { perror("close"); exit(1); }
printf("BLKGETSIZE=%ld BLKSSZGET=%ld BLKGETSIZE64=%lld BLKGETSIZE64/BLKSSZGET=%ld SIZEGB=%f #%f\240GiB\n\n",\
blk,ssz,oct,(long)(oct/(long long)ssz),(double)oct/1000000000.0,(double)oct/1073741824.0);
fflush(stdout); /* before exec */
execl("/bin/bash","bash","-c",\
"for i in \
/sys/block/?d?/{size,alignment_offset,?d??/size,?d??/alignment_offset,queue/*block*,queue/*sector*}; \
do test -f \"$i\" && echo \"$i: $(<$i)\"; done"\
,NULL);
exit(127);
return 127; /* not reached */
}
См. http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
blockdev (8) имеет другой ответ? Опции --getsz
и удержанный от использования --getsize
не то же.
blockdev --getss
) для физического размера сектора иblockdev --getbsz
) для логического размера сектора.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
в Linux источник ядра содержит вводящие в заблуждение комментарии. BLKPBSZGET (замечают P) получает физический размер сектора, BLKSSZGET получает логический размер сектора и BLKBSZGET (или BLKBSZGET_32 в block/compat_ioctl.c
) получает единицу распределения файловых систем (кластер) размер. Логический и физический размер сектора отличается, когда Усовершенствованный Формат 512e используется. (512e WP)
– Palec
22.02.2015, 23:03
echo "`cat /sys/class/block/sda2/size`*512" | bc
или если Вы используете удар или какую-либо другую подобную POSIX оболочку, арифметические операторы которой работают с целыми числами на 64 бита, Вы не должны даже звонить bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
дает размер в байте.
Вызов к cat
и ветвление (за исключением bash
) может быть оптимизирован далеко с bash
, ksh93
и zsh
с:
echo "$((512*$(</sys/class/block/sda2/size)))"
Никакая потребность в ioctl в C. Просто ищите в конец файла и получите размер (в байтах) тот путь:
/* define this before any #includes when dealing with large files: */
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// ...
int fd = open("/dev/sda", O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
// Now size is the size of the file, in bytes, or -1 on error.
// lseek(fd, 0, SEEK_SET) to get back to the start of the file.
Как насчет:
fdisk -l
Это даст Вам список всех Ваших дисков с их соответствующей способностью, использованием, и т.д.
Этот простой код. Не удалось найти документацию, но добивается цели приятно:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
возвращает размер в байтах. Посмотрите linux/fs.h
, который отмечает "размер устройства возврата в байтах". Отметьте это BLKGETSIZE
(никакой "64"), возвращает его "/512".
– Thanatos
04.03.2013, 01:26
file
потребности быть дескриптором файла (например, от open()
), и file_size_in_bytes
должен быть a size_t
.
– mwfearnley
28.01.2018, 21:54
file_size_in_bytes
должен быть 64-разрядный тип, таким образом, это должно быть unsigned long long
.)
– mwfearnley
28.01.2018, 22:17
cat /sys/class/block/sda/size
Это дает Вам его размер в 512-байтовых блоках.
blockdev --getsize64 /dev/sda
размер возвратов в байтах.
blockdev --getsz /dev/sda
размер возвратов в 512-байтовых секторах.
Удержанный от использования: blockdev --getsize /dev/sda
размер возвратов в секторах.
blockdev является частью util-linux.
--getsize
удерживается от использования и предлагает --getsz
для последовательных 512-байтовых секторов. Если --getsize
должен использоваться, я предполагаю --getss
должен также использоваться, чтобы удостовериться, что размер сектора - то, что Вы ожидаете.
– mwfearnley
28.01.2018, 19:49
df -k | grep /dev/sda
даст Вам размер в КБ (первое число), а также использованное пространство (второе число) и расположит с интервалами доступный (третье число)
Существует названная утилита EMC inq
который дает информацию обо всех типах блочных устройств как присоединенный локальный, базирующийся SAN, и т.д.
Попробовать.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Вот краткое описание того, что оно делает: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
Во-первых, моя благодарность всем, кто способствовал. Я изучил несколько полезных вещей.
Однако, мой опыт состоит в том, что большинство этих ответов является несколько неполным, по крайней мере, где CD и DVD затронуты, особенно относительно того, доступны ли они обычным пользователям, а не ограниченные суперпользователем.
Это основано на тестах на моем Linux Mageia 2.
К командам, предназначенным для суперпользователя, может всегда получать доступ обычный пользователь путем добавления префикса их с /sbin/
, или иногда с/usr/sbin/. Теперь они могут или не могут работать на обычного пользователя.
Многие могут работать, для обычного пользователя, для DVD на DVD-приводе, даже когда он не смонтирован, в то время как они не будут работать на жесткий диск (снова при вызове как обычный пользователь).
Например, /sbin/fdisk -l /dev/cdrom
будет работать над моей системой и давать "геометрию" DVD в диске..., который является, по-видимому, главным образом ерундой. Но это действительно дает размер DVD в байтах и в секторах и корректном размере сектора (2 048 байтов, как обычно для DVD).
То же верно для /usr/sbin/gdisk -l /dev/cdrom
, которые дают только размер в секторах 2 048 байтов.
другие примеры (как некорневой, обычный пользователь)
$ /sbin/blockdev --getss /dev/cdrom # DVD sector size
2048
$ /sbin/blockdev --getsize64 /dev/cdrom # DVD byte size
5453316096
$ cat /proc/partitions # see below
...
8 8 416027241 sda8
11 0 5325504 sr0
8 16 1465138584 sdb
...
Это работает на DVD-привод, здесь названный sr0
, так как устройство для него на самом деле /dev/sr0
, /dev/cdrom
будучи только символьной ссылкой на него. Размер дан в блоках 1k.
Точно так же как обычный пользователь, команда
$ cat /sys/class/block/sr0/size
10651008
даст размер DVD на устройстве /dev/sr0
, в блоках 512 байтов (а также размер другого диска, даже не смонтированного). Однако cat /sys/class/block/cdrom/size
не будет работать быть причиной/dev/cdrom, только символьная ссылка
Команда df
, предложенный некоторыми, дает размер смонтированных разделов, не целых дисков. Кроме того, для смонтированного CD или DVD это дает меньше, чем фактический размер CD/DVD. Более точно существует два отличных размера, которыми можно интересоваться:
dd
;df
.lsblk
дает информацию, которую Вы ищете, включая типы устройства и точки монтирования (если таковые имеются), со структурным видом и в человекочитаемом формате.
Тип устройства означает, что работает на CD-приводы, как спросил Ganesh Sittampalam.
Только получить размер конкретного устройства в байтах:
lsblk -rbno SIZE /dev/block-device
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
выводит результат в KB
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'
Я считаю его очень полезным, чем все эти стандартные инструменты или записи протокола
Блок - это последовательность битов или байтов с фиксированной длиной, т.е. 512 байт, 4 кБ, 8 кБ, 16 кБ, 32 кБ и т.д.
blockdev --getbsz partition
Пример
# blockdev --getbsz /dev/sda1
4096
Итак, размер блока в этой файловой системе составляет 4 кБ.
Если вы используете Node.js, вы можете использовать это встроенное дополнение, чтобы получить размер блочного устройства, размер физического сектора и размер логического сектора (с поддержкой FreeBSD, Linux, macOS и Windows ). У него также есть несколько других помощников для прямого ввода-вывода :
.Проще:
sudo parted -l /dev/sda
Мне легче запомнить и напечатать
Если вы хотите найти его программно на C, проверьте код утилиты -linux package-https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81
ИЛИ это тоже полезно-http://www.linuxproblem.org/art_20.html(Код работает на версии ядра Linux 5.0.0-32-generic
.)
Оба этих кода используют системный вызов ioctl.
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
– suprjami 05.08.2016, 06:01