我正在研究通过网络连接硬盘的驱动程序.有一个错误,如果我在计算机上启用两个或更多硬盘,只有第一个硬盘可以查看和识别分区.结果是,如果我在hda上有1个分区,在hdb上有1个分区,只要我连接hda,就会有一个可以挂载的分区.所以hda1一旦安装就会得到一个blkid xyz123.但是当我继续安装hdb1时,它也会出现相同的blkid,实际上,驱动程序是从hda而不是hdb读取它.
所以我想我找到了司机弄乱的地方.下面是一个调试输出,包括dump_stack,我把它放在第一个看似访问错误设备的地方.
这是代码部分:
/*basically, this is just the request_queue processor. In the log output that
follows, the second device, (hdb) has just been connected, right after hda
was connected and hda1 was mounted to the system. */
void nblk_request_proc(struct request_queue *q)
{
struct request *req;
ndas_error_t err = NDAS_OK;
dump_stack();
while((req = NBLK_NEXT_REQUEST(q)) != NULL)
{
dbgl_blk(8,"processing queue request from slot %d",SLOT_R(req));
if (test_bit(NDAS_FLAG_QUEUE_SUSPENDED, &(NDAS_GET_SLOT_DEV(SLOT_R(req))->queue_flags))) {
printk ("ndas: Queue is suspended\n");
/* Queue is suspended */
#if ( LINUX_VERSION_CODE …Run Code Online (Sandbox Code Playgroud) 挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘.它应该通过USB与Windows应用程序交换这些数据.当用户可以访问这些数据时 - 例如通过USB大容量存储 - 它必须加密.它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等.
计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows.每当Windows访问一个文件时,我都会得到回调并动态加密数据.此外,我们可以拥有一些动态内容 - 例如,当某些密码被写入文件时,会显示更多内容.
问题:当使用海量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录).为什么?
[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...].操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化.(来自维基百科)
所以没有机会通过大容量存储来建立动态文件系统......这似乎是为什么当我将它连接到PC时,为什么我的Android手机会在手机上卸载所有数据.
选项:
目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?
我会很感激!
查理
我正在阅读Robert Love的Linux内核开发.我不明白这段bio结构:
内核中块I/O的基本容器是生物结构,其定义在
<linux/bio.h>.此结构表示作为段列表在行(活动)的块I/O操作.段是在内存中连续的缓冲区块.因此,各个缓冲区在存储器中不需要是连续的.通过允许以块为单位描述缓冲区,bio结构为内核提供了从存储器中的多个位置执行甚至单个缓冲区的块I/O操作的能力.像这样的向量I/O称为分散 - 聚集I/O.
flight(active)意思?public final static void lockDevice()
{
try
{
if (devicePolicyManager.isAdminActive(adminComponent))
{
devicePolicyManager.lockNow();
}
}
catch (final Exception ex)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不会抛出任何异常,也不会锁定motorola xoom平板电脑的屏幕.(Homeycomb和Icecream Sandwitch)相同的代码在其他Homeycomb和ICS平板电脑上完美运行.
我用Google搜索,但没有得到任何解决方案.有任何想法吗.....?
我不确定这是否是这个问题的正确位置.我试图从/dev/input/js0我的系统上的操纵杆获取轴位置值.如果我运行jstest /dev/input/js0它会给我实时反馈所有按钮和轴位置.
我试图将这些信息提供给我的C程序来控制伺服系统.这样做有功能吗?我在编程中没有使用输入设备,所以这对我来说都是新的.
我的笔记本电脑上有一个20 GB的SSD设备,我决定尝试使用bcache.它似乎工作,但一段时间以来,我一直在启动时收到错误:
error on 0f3bbb55-6839-4ed6-8127-7976a969f726: corrupted btree at bucket 17571, block 483, 61 keys, disabling caching
Run Code Online (Sandbox Code Playgroud)
我想我可以尝试修复这个,但我已经决定我可能更好的只是禁用bcache - 我不太了解这可能会丢失数据/头发如果出现问题,我认为我会更好关闭使用分区作为交换更快的冬眠.
我的问题是,如何在不重新格式化支持设备的情况下安全地停止在设备上使用bcache?
我使用/ dev/sda7作为我的后备设备,/ dev/sdb2作为缓存设备(/ dev/sdb1是root).
如果重要的话,我正在使用内核3.13.0-21-generic运行Ubuntu 14.04.
更新:我基本上正在寻找一种能够恢复make-bcache -B所做更改的解决方案.FWIW,我最终通过将所有内容移动到新分区并删除旧分区来解决这个问题(请参阅下面的评论),但我会留下这个问题以防万一有人有实际的解决方案.
希望你能帮助我:我正在尝试确定设备是否可移动,我所拥有的只是设备名称(/ dev/sdc).实际上,我需要通过此文件的完整路径确定可移动媒体上的文件或本地磁盘上的文件.
我试着在current-> fs-> pwd中搜索, 我在这里找到的是一组标志:*current-> fs-> pwd.mnt-> mnt_sb-> frostdev-> bd_disk-> flags*其中GENHD_FL_REMOVABLE设置为可移动设备
但我总是得到相同的标志集(据我所知,greasedev总是指向同一个设备(/ dev/sda)).
所以现在我通过解析mtab得到包含我的文件的设备名称(/ dev/sdc),但仍然找不到,可以删除它.
是否有可能通过设备名称获取block_device结构?(例如,"file"结构可以通过调用fd = open("name")fl = fged(fd)获得,其中fl指向"file"结构)
我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(参见include/linux/blkdev.h2.6.32内核源代码)
static struct block_device_operations sbd_ops = {
.owner = THIS_MODULE,
.open = sbd_open,
.release = sbd_close,
.ioctl = sbd_ioctl,
.getgeo = sbd_getgeo,
.locked_ioctl = sbd_locked_ioctl,
.compat_ioctl = sbd_compat_ioctl,
.direct_access = sbd_direct_access,
.media_changed = sbd_media_changed,
.revalidate_disk = sbd_revalidate_disk
};
Run Code Online (Sandbox Code Playgroud)
我编译了驱动程序.我插入了模块并/dev/sbd0创建了.现在我想测试我的驱动程序代码.所以我写了一个如下的应用程序.
fd = open("/dev/sbd0", O_RDONLY);
retval = ioctl(fd, BLKBSZGET, &blksz); //trying to get logical block size
Run Code Online (Sandbox Code Playgroud)
输出是:4096
我想知道:我没有实现ioctl BLKBSZGET.它没有调用我sbd_ioctl,而是使用了默认驱动程序并给了我结果.因为open,close调用它执行sbd_open和sbd_close(我实现).然后我尝试了:
retval = ioctl(fd, HDIO_GETGEO, &geoinfo); …Run Code Online (Sandbox Code Playgroud) 嗨我最近做了一个关于rbd到qemu目标的virtio-scsi实验(用于它的DISCARD/TRIM支持),并将吞吐量和iops与同一台机器上的rbd设置中的virtio-blk进行了比较,在客户端使用fio .连续读写的吞吐量小7倍(42.3MB/s vs 309MB/s),随机读写中的iops小10倍(546 vs 5705).
我所做的是使用OpenStack Juno设置一个虚拟机,它给了我rbd设置的virtio-blk.然后我修改了libvirt configure xml中的相关部分,由此:
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='writeback'/>
<auth username='cinder'>
<secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/>
</auth>
<source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'>
<host name='192.168.20.105' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
Run Code Online (Sandbox Code Playgroud)
对此:
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='writeback' discard='unmap'/>
<auth username='cinder'>
<secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/>
</auth>
<source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'>
<host name='192.168.20.105' port='6789'/>
</source>
<target dev='vda' bus='scsi'/>
<controller type='scsi' model='virtio-scsi' index='0'/>
</disk>
Run Code Online (Sandbox Code Playgroud)
软件版本是:
qemu 2.5.1
libvirt 1.2.2
内核 3.18.0-031800-generic#201412071935 SMP Mon Dec …
我使用kubernetes v1.16.10和Ceph 13.2.2 Mimic集群通过ceph -csi进行动态卷配置。
但后来我找到了ceph-rbd
Ceph RBD (kubernetes.io/rbd)
https://kubernetes.io/docs/concepts/storage/storage-classes/#ceph-rbd
根据:
Ceph CSI (rbd.csi.ceph.com)
https://docs.ceph.com/docs/master/rbd/rbd-kubernetes/#block-devices-and-kubernetes
您可以通过 ceph-csi 将 Ceph 块设备映像与 Kubernetes v1.13 及更高版本一起使用,该映像动态提供 RBD 映像以支持 Kubernetes 卷,并将这些 RBD 映像映射为工作节点上的块设备(可选择挂载包含在映像中的文件系统)运行引用 RBD 支持的卷的 pod。
那么……我应该使用哪一种?
优点缺点?
提前致谢。
provisioning block-device ceph kubernetes persistent-volumes
block-device ×10
linux ×5
c ×2
kernel ×2
linux-kernel ×2
android ×1
bcache ×1
ceph ×1
device ×1
diskcache ×1
filesystems ×1
kubernetes ×1
libvirt ×1
locking ×1
motorola ×1
performance ×1
provisioning ×1
qemu ×1
scsi ×1
udev ×1