từ chối trách nhiệm: Tôi là tác giả của chỉ số này và nó được viết cho câu hỏi cụ thể này
Cập nhật ngày 23 tháng 10 năm 2018
Các chỉ số hiện hỗ trợ niêm yết mạng chia sẻ . Cảm ơn mihaigalos
Cập nhật ngày 29 tháng 10 năm 2016
Hiện tại chỉ báo có chức năng ngắt kết nối và các bí danh đã được tạo thành duy nhất bằng cách tham khảo UUID của từng phân vùng thay vì chặn tên thiết bị như sda1
. Xem báo cáo lỗi liên quan
Cập nhật, tháng 8.2016
Chỉ báo này hiện ở phiên bản 2.0, đã thêm một vài tính năng và có PPA riêng.
Để cài đặt từ PPA, sử dụng các bước sau trong thiết bị đầu cuối:
sudo apt-add-repository ppa:udisks-indicator-team/ppa
sudo bash -c 'apt-get update && apt-get install udisks-indicator'
Như đã đề cập trong bản phát hành, các tính năng bao gồm:
- Các biểu tượng cho các mục menu: mỗi phân vùng / thiết bị có biểu tượng phù hợp kèm theo nó. Nếu thiết bị là đĩa usb, biểu tượng phương tiện di động được sử dụng, nếu đó là hình ảnh iso - biểu tượng đĩa quang được sử dụng và phân vùng ổ cứng / SSD rõ ràng có biểu tượng ổ đĩa.
- Việc sử dụng hiện được hiển thị theo tỷ lệ phần trăm và giá trị có thể đọc được của con người (quyền hạn 1024).
- Biểu diễn đồ họa của việc sử dụng thông qua thanh sử dụng (cảm ơn ý tưởng của Mateo Salta)
- Hộp thoại tùy chọn: người dùng có thể tắt một số trường nhất định mà họ không muốn thấy trên mỗi mục nhập menu. Điều này cho phép giữ menu chỉ báo sạch nếu có một lượng lớn phân vùng kèm theo. (Cảm ơn yêu cầu của Zacharee)
- Khoảng cách văn bản: với phông chữ Ubuntu và phông chữ Monospace mặc định, các mục nhập văn bản được đặt cách đều nhau để có giao diện rõ ràng hơn và tăng cường khả năng đọc thông tin.
- Bong bóng thông báo trong trường hợp phân vùng không thể được gắn kết
Dưới đây là ảnh chụp màn hình với chủ đề biểu tượng Ubuntu mặc định:
Chủ đề biểu tượng Ubuntu Kylin
Với tất cả các trường tùy chọn tắt
Lựa chọn thiết kế và suy nghĩ bổ sung:
Khi tạo ra chỉ số này, tôi hy vọng sẽ đạt được một tiện ích phù hợp cho cả người dùng cao cấp và người dùng thông thường. Tôi đã cố gắng giải quyết một số vấn đề mà tôi nhận thấy người dùng mới có thể gặp phải khi xử lý các công cụ dòng lệnh. Ngoài ra, tiện ích phấn đấu để được đa năng.
Hộp thoại Preferences cho phép làm cho chỉ báo trở nên phức tạp và / hoặc đơn giản như người dùng mong muốn. Đó cũng là một quyết định thiết kế cụ thể để tránh có nhãn trong bảng trên cùng để nó không chiếm quá nhiều không gian bảng trên cùng của người dùng. Ngoài ra, chỉ báo này cố gắng trở thành tiện ích đa năng cho phép gắn các phân vùng cũng như mở các thư mục tương ứng của chúng. Điều này có thể được sử dụng không chỉ là tiện ích sử dụng đĩa, mà còn là tiện ích điều hướng để mở nhanh các thư mục.
Nó cũng thuận tiện cho người dùng biết phân vùng nào sinh sống trên đĩa nào, do đó tránh sự nhầm lẫn thường xuyên với việc gắn kết thông qua các tiện ích dòng lệnh như mount
. Thay vào đó, nó sử dụng udisksctl
cho mục đích đó (cũng như có được thông tin từ UDisks2
daemon, do đó việc đặt tên). Nhiệm vụ duy nhất mà nó không thực hiện là không đếm được, hoặc lý do Open Disks Utility
này bao gồm các mục menu.
Mặc dù ban đầu tôi đã cố gắng làm cho nó giống với iStat menulet, dự án đã chuyển hướng khỏi mục tiêu này - chỉ số này là duy nhất trong thiết kế và mục đích của nó. Tôi hy vọng nó sẽ được tìm thấy hữu ích cho nhiều người dùng và làm cho trải nghiệm Ubuntu của họ dễ chịu hơn nhiều.
chỉ số udisks (câu trả lời gốc)
Chỉ báo cho Ubuntu với máy tính để bàn Unity để hiển thị mức sử dụng đĩa
Tổng quat
Chỉ báo này cho Ubuntu với Unity cho phép dễ dàng xem thông tin về các phân vùng được gắn kết của bạn. Nó phấn đấu tương tự như trực quan với menu iStat Menu 3 từ OS X.
Các mục được sắp xếp theo thứ tự:
- Vách ngăn
- Bí danh (nếu được đặt bởi người dùng)
- Ổ đĩa thuộc phân vùng nào
- Mountpoint của phân vùng (thư mục)
- % Sử dụng
Nhấp vào từng mục phân vùng sẽ mở điểm gắn kết của phân vùng trong trình quản lý tệp mặc định
Menu "Unmounted Partitions" liệt kê tất cả các phân vùng hiện không được hệ thống gắn kết. Nhấp vào bất kỳ mục nào trong menu con đó sẽ tự động gắn phân vùng đó vào /media/username/drive-id
thư mục
Chỉ báo sử dụng các biểu tượng mặc định được cung cấp cùng với hệ thống, vì vậy biểu tượng sẽ được thay đổi khi bạn thay đổi chủ đề biểu tượng bằng Unity Tweak Tool hoặc các phương thức khác
LƯU Ý : nếu bạn muốn thêm nhiều bí danh cùng một lúc, thay vì từng cái một thông qua tùy chọn "Tạo bí danh", bạn có thể làm như vậy thông qua chỉnh sửa ~/.partition_aliases.json
tệp cấu hình. Định dạng như sau:
{
"sda1": "Alias 1",
"sda2": "Alias 2",
"sdb1": "Alias 3"
}
Cài đặt
Sắp có PPA để dễ dàng cài đặt. . .
Trong lúc này, đây là các bước thay thế:
cd /tmp
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop
Tất cả các bước này có thể được đưa vào một tập lệnh cài đặt nhỏ xinh:
#!/bin/bash
cd /tmp
rm master.zip*
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop
Mã nguồn
Mã nguồn gốc (Phiên bản v1.0) với chức năng cơ bản của chỉ báo này có thể được tìm thấy bên dưới. Để biết các tính năng mới nhất, hãy kiểm tra kho GitHub cho dự án này . Vui lòng báo cáo bất kỳ yêu cầu tính năng cũng như lỗi trên GitHub.
các /usr/bin/udisks-indicator
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Author: Serg Kolo , contact: 1047481448@qq.com
# Date: September 27 , 2016
# Purpose: appindicator for displaying mounted filesystem usage
# Tested on: Ubuntu 16.04 LTS
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import gi
gi.require_version('AppIndicator3', '0.1')
from gi.repository import GLib as glib
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Gtk as gtk
from os import statvfs
#from collections import OrderedDict
import subprocess
import shutil
import dbus
import json
import os
class UdisksIndicator(object):
def __init__(self):
self.app = appindicator.Indicator.new(
'udisks-indicator', "drive-harddisk-symbolic.svg",
appindicator.IndicatorCategory.HARDWARE
)
if not self.app.get_icon():
self.app.set_icon("drive-harddisk-symbolic")
self.app.set_status(appindicator.IndicatorStatus.ACTIVE)
filename = '.partition_aliases.json'
user_home = os.path.expanduser('~')
self.config_file = os.path.join(user_home,filename)
self.cache = self.get_partitions()
self.make_menu()
self.update()
def update(self):
timeout = 5
glib.timeout_add_seconds(timeout,self.callback)
def callback(self):
if self.cache != self.get_partitions():
self.make_menu()
self.update()
def make_menu(self,*args):
""" generates entries in the indicator"""
if hasattr(self, 'app_menu'):
for item in self.app_menu.get_children():
self.app_menu.remove(item)
self.app_menu = gtk.Menu()
partitions = self.get_partitions()
for i in partitions:
part = "Partition: " + i[0]
alias = self.find_alias(i[0])
drive = "\nDrive: " + i[1]
mount = "\nMountPoint: " + i[2]
usage = "\n%Usage: " + i[3]
item = part + drive + mount + usage
if alias:
alias = "\nAlias: " + alias
item = part + alias + drive + mount + usage
self.menu_item = gtk.MenuItem(item)
self.menu_item.connect('activate',self.open_mountpoint,i[2])
self.app_menu.append(self.menu_item)
self.menu_item.show()
self.separator = gtk.SeparatorMenuItem()
self.app_menu.append(self.separator)
self.separator.show()
self.unmounted = gtk.MenuItem('Unmounted Partitions')
self.unmounted_submenu = gtk.Menu()
self.unmounted.set_submenu(self.unmounted_submenu)
for i in self.get_unmounted_partitions():
# TODO: add type checking, prevent swap
part = "Partition: " + i[0]
alias = self.find_alias(i[0])
drive = "\nDrive: " + i[1]
label = part + drive
if alias:
alias = "\nAlias: " + alias
label = part + alias + drive
self.menu_item = gtk.MenuItem(label)
self.menu_item.connect('activate',self.mount_partition,i[0])
self.unmounted_submenu.append(self.menu_item)
self.menu_item.show()
self.separator = gtk.SeparatorMenuItem()
self.unmounted_submenu.append(self.separator)
self.separator.show()
self.app_menu.append(self.unmounted)
self.unmounted.show()
self.separator = gtk.SeparatorMenuItem()
self.app_menu.append(self.separator)
self.separator.show()
self.make_part_alias = gtk.MenuItem('Make Alias')
self.make_part_alias.connect('activate',self.make_alias)
self.app_menu.append(self.make_part_alias)
self.make_part_alias.show()
user_home = os.path.expanduser('~')
desktop_file = '.config/autostart/udisks-indicator.desktop'
full_path = os.path.join(user_home,desktop_file)
label = 'Start Automatically'
if os.path.exists(full_path):
label = label + ' \u2714'
self.autostart = gtk.MenuItem(label)
self.autostart.connect('activate',self.toggle_auto_startup)
self.app_menu.append(self.autostart)
self.autostart.show()
self.open_gnome_disks = gtk.MenuItem('Open Disks Utility')
self.open_gnome_disks.connect('activate',self.open_disks_utility)
self.app_menu.append(self.open_gnome_disks)
self.open_gnome_disks.show()
self.quit_app = gtk.MenuItem('Quit')
self.quit_app.connect('activate', self.quit)
self.app_menu.append(self.quit_app)
self.quit_app.show()
self.app.set_menu(self.app_menu)
def mount_partition(self,*args):
# TODO: implement error checking for mounting
return self.run_cmd(['udisksctl','mount','-b','/dev/' + args[-1]])
def get_mountpoint_usage(self,mountpoint):
fs = statvfs(mountpoint)
usage = 100*(float(fs.f_blocks)-float(fs.f_bfree))/float(fs.f_blocks)
return str("{0:.2f}".format(usage))
def get_partitions(self):
objects = self.get_dbus('system',
'org.freedesktop.UDisks2',
'/org/freedesktop/UDisks2',
'org.freedesktop.DBus.ObjectManager',
'GetManagedObjects',
None)
partitions = []
for item in objects:
try:
if 'block_devices' in str(item):
drive = self.get_dbus_property('system',
'org.freedesktop.UDisks2',
item,
'org.freedesktop.UDisks2.Block',
'Drive')
if drive == '/': continue
mountpoint = self.get_mountpoint(item)
if not mountpoint: continue
mountpoint = mountpoint.replace('\x00','')
drive = str(drive).split('/')[-1]
usage = self.get_mountpoint_usage(mountpoint)
part = str(item.split('/')[-1])
partitions.append((part,drive,mountpoint,usage))
except Exception as e:
#print(e)
pass
# returning list of tuples
partitions.sort()
return partitions
def get_mountpoint(self,dev_path):
try:
data = self.get_dbus_property(
'system',
'org.freedesktop.UDisks2',
dev_path,
'org.freedesktop.UDisks2.Filesystem',
'MountPoints')[0]
except Exception as e:
#print(e)
return None
else:
if len(data) > 0:
return ''.join([ chr(byte) for byte in data])
def get_unmounted_partitions(self):
objects = self.get_dbus('system',
'org.freedesktop.UDisks2',
'/org/freedesktop/UDisks2',
'org.freedesktop.DBus.ObjectManager',
'GetManagedObjects',
None)
partitions = []
for item in objects:
try:
if 'block_devices' in str(item):
drive = self.get_dbus_property('system',
'org.freedesktop.UDisks2',
item,
'org.freedesktop.UDisks2.Block',
'Drive')
if drive == '/': continue
mountpoint = self.get_mountpoint(item)
if mountpoint: continue
drive = str(drive).split('/')[-1]
part = str(item.split('/')[-1])
if not part[-1].isdigit(): continue
partitions.append((part,drive))
#print(partitions)
except Exception as e:
#print(e)
pass
partitions.sort()
return partitions
def get_dbus(self,bus_type,obj,path,interface,method,arg):
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj,path)
method = proxy.get_dbus_method(method,interface)
if arg:
return method(arg)
else:
return method()
def get_dbus_property(self,bus_type,obj,path,iface,prop):
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj,path)
aux = 'org.freedesktop.DBus.Properties'
props_iface = dbus.Interface(proxy,aux)
props = props_iface.Get(iface,prop)
return props
def make_alias(self,*args):
partitions = [ i[0] for i in self.get_partitions() ]
combo_values = '|'.join(partitions)
#print(combo_values)
command=[ 'zenity','--forms','--title','Make Alias',
'--add-combo','Partition','--combo-values',
combo_values,'--add-entry','Alias' ]
user_input = self.run_cmd(command)
if not user_input: return
alias = user_input.decode().strip().split('|')
existing_values = None
if os.path.isfile(self.config_file):
with open(self.config_file) as conf_file:
try:
existing_values = json.load(conf_file)
except ValueError:
pass
with open(self.config_file,'w') as conf_file:
if existing_values:
existing_values[alias[0]] = alias[1]
else:
existing_values = {alias[0]:alias[1]}
#print(existing_values)
json.dump(existing_values,conf_file,indent=4,sort_keys=True)
def find_alias(self,part):
if os.path.isfile(self.config_file):
with open(self.config_file) as conf_file:
try:
aliases = json.load(conf_file)
except ValueError:
pass
else:
if part in aliases:
return aliases[part]
else:
return None
def toggle_auto_startup(self,*args):
user_home = os.path.expanduser('~')
desktop_file = '.config/autostart/udisks-indicator.desktop'
full_path = os.path.join(user_home,desktop_file)
if os.path.exists(full_path):
os.unlink(full_path)
else:
original = '/usr/share/applications/udisks-indicator.desktop'
if os.path.exists(original):
shutil.copyfile(original,full_path)
self.make_menu()
def open_mountpoint(self,*args):
pid = subprocess.Popen(['xdg-open',args[-1]]).pid
def open_disks_utility(self,*args):
pid = subprocess.Popen(['gnome-disks']).pid
def run_cmd(self, cmdlist):
""" Reusable function for running external commands """
new_env = dict(os.environ)
new_env['LC_ALL'] = 'C'
try:
stdout = subprocess.check_output(cmdlist, env=new_env)
except subprocess.CalledProcessError:
pass
else:
if stdout:
return stdout
def run(self):
""" Launches the indicator """
try:
gtk.main()
except KeyboardInterrupt:
pass
def quit(self, data=None):
""" closes indicator """
gtk.main_quit()
def main():
""" defines program entry point """
indicator = UdisksIndicator()
indicator.run()
if __name__ == '__main__':
main()
Các /usr/share/applications/udisks-indicator.desktop
[Desktop Entry]
Version=1.0
Name=Udisks Indicator
Comment=Indicator for reporting partition information
Exec=udisks-indicator
Type=Application
Icon=drive-harddisk-symbolic.svg
Terminal=false
Thông tin bổ sung:
Thử nghiệm Ubuntu Mate 16.04:
Người dùng Gnome cần một tiện ích mở rộng (Hỗ trợ KStatusNotifierItem / AppIndicator) để làm cho chỉ báo hoạt động đúng:
/dev/sdb1
và sử dụng ngay bên cạnh nó? Trong phần trăm hoặc gigabyte thực tế?